2012-03-11 4 views
45

Próbuję uzyskać dostęp do mojego konta Gmail przez mój localhost. Jednak ja dostaję odpowiedź:Błąd krytyczny: wywołanie niezdefiniowanej funkcji imap_open() w PHP

Fatal error: Zadzwoń do niezdefiniowanej funkcji imap_open()

Czy ktoś może wskazać, co należy zrobić, aby rozwiązać ten problem?

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
$username = '[email protected]'; 
$password = 'mypassword'; 

/* try to connect */ 
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' .imap_last_error()); 
+0

można pokazać swój kod? –

+0

Dodano kod Kurdn. – Sumit

+0

Proszę dodać tag PHP, gdy chodzi o PHP. –

Odpowiedz

66

Wystarczająco proste, rozszerzenie IMAP nie jest aktywowane w twojej instalacji PHP. To nie jest enabled by default. Jeśli lokalna instalacja jest uruchomiona XAMPP na Windows, musisz ją włączyć w sposób opisany w XAMPP FAQ:

Where is the IMAP support for PHP?

As default, the IMAP support for PHP is deactivated in XAMPP, because there were some mysterious initialization errors with some home versions like Windows 98. Who works with NT systems, can open the file "\xampp\php\php.ini" to active the php exstension by removing the beginning semicolon at the line ";extension=php_imap.dll" . Should be: extension=php_imap.dll

Now restart Apache and IMAP should work. You can use the same steps for every extension, which is not enabled in the default configuration.

+0

Dzięki! Pozbyłem się błędu. – Sumit

+0

@Sumit, może zechcesz wybrać to jako odpowiedź! –

+0

postępuje zgodnie z Twoimi instrukcjami, ale wciąż pojawia się błąd Błąd krytyczny: wywołanie niezdefiniowanej funkcji imap_open() w –

7

jeśli jesteś na Linuksie, edytować /etc/php/php.ini (lub trzeba będzie utworzyć nowy plik importu rozszerzenie na /etc/php5/cli/conf.d), aby dodać plik imap shared object, a następnie zrestartuj serwer apache. Odkomentuj

;extension=imap.so 

tak, że staje się to tak:

extension=imap.so 

Następnie należy ponownie uruchomić apache przez

# /etc/rc.d/httpd restart 
51

procedurą Instalacja jest zawsze taka sama, ale pakiet-manager i nazwa pakietu zmienia się w zależności od tego, której dystrybucji, wersji i/lub repozytorium używa.Generalnie, etapy są następujące:

a) at first, user privilege escalation is required, either obtained with the commands su or sudo .

b) then one can install the absent PHP module with a package manager.

c) after that, restarting the apache2 HTTP daemon is required to load the module.

d) at last, one can run php -m | grep imap to see if the PHP module is now available.

Na UbuntuAPT pakiet php5-imap (lub php-imap) może BEI zainstalowany apt-get:

apt-get install php5-imap 
service apache2 restart 

Na Debianie, pakiet APTphp5-imap może być zainstalowane aptitude (lub apt-get):

aptitude install php5-imap 
apache2ctl graceful 

Na CentOS i Fedora pakiet RPMphp-imap może być instalowany z yum (wskazówka: nazwa pakietu może być coś podobnie php56w-imap lub php71w-imap podczas korzystania Webtatic repo):

yum install php-imap 
service httpd restart 

W systemach systemd podczas używania systemd units polecenie ponownego uruchomienia jednostki httpd.service jest następujące:

systemctl restart httpd.service 

Rozwiązanie stwierdzono powyżej ma problemu, że gdy moduł został już wymieniony w:

/etc/php5/apache2/php.ini 

Może rzucić:

PHP Warning: Module 'imap' already loaded in Unknown on line 0 

tak się dzieje, ponieważ odwołuje się domyślny Plik php.ini (przynajmniej na Ubuntu 12.04) i moduł PHP musi mieć co najwyżej odniesienie po. Korzystanie INI fragmenty załadować moduły sugeruje, natomiast katalog /etc/php5/conf.d/ (czyli ścieżka może również zmieniać) jest skanowany do INI plików:

/etc/php5/conf.d/imap.ini 

Ubuntu posiada również własnych poleceń do zarządzania modułów PHP, które mają być wykonywane przed ponownym uruchomieniem wstęga serwer:

php5enmod imap 
php5dismod imap 

IMAP Gdy moduł jest załadowany do serwera, PHP IMAP Functions powinno się wtedy dostępna; najlepszą praktyką może być sprawdzenie, czy moduł jest jeszcze załadowany, zanim spróbuje go użyć.

+0

W systemie Ubuntu musiałem wykonać "php5enmod imap" oprócz instalacji pakietu! - zobacz anser z @pramod kadam poniżej – mattanja

+0

@mattanja to zależy od tego, czy 'conf.d/imap.ini' jest obecny i parsowany, czy' 'php5enmod' jest specyficznym dla systemu Ubuntu poleceniem, które zasadniczo nie robi nic innego jak utwórz ten plik - podczas gdy 'php5dismod' usuwa go. zaktualizował odpowiedź, zgodnie z twoją sugestią. –

+0

zrozumiałe. Po prostu powiedz, odpowiedź jest teraz bardziej kompletna, dziękuję! (Podanie informacji w opisie Ubuntu może zaoszczędzić kilka sekund dla kogoś;) – mattanja

2

jeśli jest to centos z zainstalowanym php 5.3.

sudo yum install php53-imap

i restart apache

httpd sudo/sbin/service restart lub sudo service apache2 restart

+0

można pominąć wpisanie/sbin - ponieważ ścieżka ta jest zwykle zawarta w środowisku $ PATH root'a. Wystarczy raz sprawdzić /root/.bashrc - a zobaczysz, co jest podane. –

4

Z

echo get_cfg_var('cfg_file_path'); 

można znaleźć z którego php.ini zostało użyte przez to wystąpienie php.

31

w Ubuntu do zainstalowania IMAP

sudo apt-get install php-IMAP

Ubuntu 14.04 i powyżej użytku

sudo apt-get install php5-imap

i imap domyślnie nie są włączone przez php, więc użyj tego polecenia, aby włączyć imap extention

sudo php5enmod IMAP

następnie ponownie uruchom apache

serwis sudo apache2 restart

+0

+1 to był mój przypadek: lub możesz przejść do /etc/php5/apache2/conf.d i zrobić ln -s ../../mods-available/imap.ini ./20-imap.ini – Mike

+2

Dobre wezwanie na linii 'php5enmod', nie było w innych odpowiedziach, ale to nie działało dla mnie, dopóki tego nie zrobiłem. – M1ke

+1

dotyczące http://www.php.net/manual/en/imap.setup.php na Ubuntu 14.04+ powinno być sudo apt-get install php5-imap (nie php-imap) sudo php5enmod imap – lubart

4

Podczas migracji z Ubuntu 12.04 do 14.04 Natknąłem się nad tym, jak dobrze i chciałem podzielić się że jak Ubuntu 14.04 LTS Wydaje się, że rozszerzenie IMAP nie jest już ładowane domyślnie.

Sprawdź, aby sprawdzić, czy jest zainstalowane rozszerzenie:

dpkg -l | grep php5-imap 

powinny dać odpowiedź tak:

ii php5-imap  5.4.6-0ubuntu5 amd64  IMAP module for php5 

jeśli nie, należy go zainstalować.

Aby rzeczywiście włączyć rozszerzenie

cd /etc/php5/apache2/conf.d 
ln -s ../../mods-available/imap.ini 20-imap.ini 
service apache2 restart 

powinno rozwiązać go dla apache. Dla CLI zrobić to samo w /etc/php5/cli/conf.d

4

W systemie Mac OS X z Homebrew, a oczywiście, PHP jest już zainstalowany z powodu przewidzianego błędu nie możemy uruchomić:

$ brew install php72 --with-imap 
Warning: homebrew/php/php72 7.2.xxx is already installed 

także instalowanie modułu tylko, tutaj nie zadziała:

$ brew install php72-imap 
Error: No available formula with the name "php72-imap" 

Więc musimy ponowna go:

$ brew reinstall php72 --with-imap 

It will take a while :-) (built in 8 minutes 17 seconds)

0

Ubuntu z Nginx i PHP-FPM 7 użyj:

sudo apt-get install php-IMAP

serwis php7.0-fpm restart serwis ngnix restart

Sprawdź moduł zostały zainstalowane php -m | grep IMAP

Konfiguracja modułu IMAP zostanie włączona automatycznie, zarówno w cli php.ini i na FPM php.ini

nano /etc/php/7.0/cli/conf.d/20-imap.ini nano /etc/php/7.0/fpm/conf.d/20-imap.ini

0

Jeśli lokalna instalacja jest uruchomiona XAMPP na Windows, to wystarczy: można otworzyć pliku „\ xampp \ php \ php.ini ", aby aktywować exstension php, usuwając początkowy średnik z linii"; extension = php_imap.dll ". Powinno być:

;extension=php_imap.dll 

do

extension=php_imap.dll