致命错误:在PHP中调用未定义函数imap_open()
我想通过我的本地主机访问我的Gmail帐户。 不过,我得到的回应是:
致命错误:调用未定义函数imap_open()
有人能指出我该怎么办才能解决这个问题吗?
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'myid@gmail.com'; $password = 'mypassword'; /* try to connect */ $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' .imap_last_error());
很简单,IMAP扩展没有在你的PHP安装中激活。 它没有默认启用 。 如果您的本地安装在Windows上运行XAMPP,则必须按照XAMPP常见问题中所述启用它:
IMAP对PHP的支持在哪里?
默认情况下,在XAMPP中,对PHP的IMAP支持是停用的,因为在Windows 98等一些主页版本中存在一些神秘的初始化错误。谁使用NT系统,可以打开
"\xampp\php\php.ini"
来激活通过删除行";extension=php_imap.dll"
的开始分号来使用php exstension。 应该是:extension=php_imap.dll
现在重新启动Apache和IMAP应该工作。 您可以对每个扩展使用相同的步骤,这在默认configuration中未启用。
安装过程总是相同的,但软件包pipe理器和软件包名称会有所不同,具体取决于使用的分发版本,版本和/或存储库。 一般来说,步骤是:
a )首先,用户权限升级是必需的,或者使用
su
或sudo
命令获得。b )然后,可以安装缺less的PHP模块与包pipe理器。
c )之后,重新启动
apache2
HTTP守护程序需要加载模块。d )最后,可以运行
php -m | grep imap
php -m | grep imap
来查看PHP模块是否可用。
在Ubuntu上 , APT
包php5-imap
(或者php-imap
)可以用apt-get
来安装:
apt-get install php5-imap service apache2 restart
在Debian上 , APT
包php5-imap
可以安装aptitude
(或apt-get
):
aptitude install php5-imap apache2ctl graceful
在CentOS和Fedora上 ,可以用yum
来安装RPM
软件包php-imap
(提示:在使用Webtatic软件仓库时,软件包的名称可能与php56w-imap
或php71w-imap
相似 ):
yum install php-imap service httpd restart
在systemd
系统上,使用systemd单元时 ,重启单元httpd.service
的命令是:
systemctl restart httpd.service
上述解决scheme存在的问题是,当模块已被引用时:
/etc/php5/apache2/php.ini
它可能会抛出:
PHP Warning: Module 'imap' already loaded in Unknown on line 0
发生这种情况是因为它是在默认的php.ini
文件中引用的(至less在Ubuntu 12.04上),PHP模块最多只能引用一次 。 build议使用INI
片段加载模块,而目录/etc/php5/conf.d/
(该path也可能有所不同)正在扫描INI
文件:
/etc/php5/conf.d/imap.ini
Ubuntu还提供专有的命令来pipe理PHP模块,在重新启动Web服务器之前执行:
php5enmod imap php5dismod imap
一旦将IMAP
模块加载到服务器中, PHP IMAP函数就会变为可用; 最好的做法可能是在试图利用它之前检查一个模块是否被加载 。
在Ubuntu上安装imap使用
sudo apt-get安装php-imap
Ubuntu 14.04及以上版本使用
sudo apt-get install php5-imap
和imap默认情况下不启用PHP所以使用此命令启用imap扩展
sudo php5enmod imap
然后重新启动你的Apache
sudo服务apache2重启
如果你在linux上,编辑/etc/php/php.ini
(或者你将不得不在/etc/php5/cli/conf.d文件中创build一个新的扩展名导入文件),以便添加imap共享目标文件然后,重新启动Apache服务器。 取消注释
;extension=imap.so
所以它变成这样:
extension=imap.so
然后,通过重新启动apache
# /etc/rc.d/httpd restart
同
echo get_cfg_var('cfg_file_path');
你可以找出哪个php.ini已经被这个php实例使用。
在从Ubuntu 12.04迁移到14.04期间,我偶然发现了这一点,并且想要分享从Ubuntu 14.04 LTS开始,IMAP扩展似乎不再被默认加载。
检查以确认扩展是否已安装:
dpkg -l | grep php5-imap
应该这样回答:
ii php5-imap 5.4.6-0ubuntu5 amd64 IMAP module for php5
如果没有,请安装它。
要真正启用扩展
cd /etc/php5/apache2/conf.d ln -s ../../mods-available/imap.ini 20-imap.ini service apache2 restart
应该修复它的Apache。 对于CLI,请在/etc/php5/cli/conf.d中执行相同的操作
如果是安装php 5.3的centos。
sudo yum安装php53-imap
并重新启动Apache
sudo / sbin / service httpd restart或sudo service apache2 restart
在Mac OS X上用Homebrew,显然,PHP已经安装了,由于提供的错误,我们不能运行:
$ brew install php72 --with-imap Warning: homebrew/php/php72 7.2.xxx is already installed
另外,只安装模块,这里将不起作用:
$ brew install php71-imap Error: No available formula with the name "php72-imap"
所以,我们必须重新安装它:
$ brew reinstall php72 --with-imap
这将需要一段时间:-)(build在8分17秒)
Ubuntu与Nginx和PHP-FPM 7使用这个:
sudo apt-get安装php-imap
服务php7.0-fpm重启服务ngnix重启
检查模块已经安装了php -m | grep imap
模块imap的configuration将在cli php.ini和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