最近用命令行刷索引的时候发现刷不了了 爆了个这个错 以前都是能刷的 难道时代变啦 ?
PHP Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'The PDO extension is required for this adapter but the extension is not loaded' in /home/wwwroot/weicot/lib/Zend/Db/Adapter/Pdo/Abstract.php:342 Stack trace: #0 /home/wwwroot/weicot/lib/Zend/Db/Adapter/Abstract.php(247): Zend_Db_Adapter_Pdo_Abstract->setFetchMode(2) #1 /home/wwwroot/weicot/app/code/core/Mage/Core/Model/Resource.php(165): Zend_Db_Adapter_Abstract->__construct(Array) #2 /home/wwwroot/weicot/app/code/core/Mage/Core/Model/Resource.php(110): Mage_Core_Model_Resource->_newConnection('pdo_mysql', Object(Mage_Core_Model_Config_Element)) #3 /home/wwwroot/weicot/app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(320): Mage_Core_Model_Resource->getConnection('core_write') #4 /home/wwwroot/weicot/app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(350): Mage_Core_Model_Resource_Db_Abstract->_getConnection('write') #5 /home/wwwroot/weicot/app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(335): Mage_Core_Model_Resource_Db_Abstract->_getWriteAdapter() #6 / in /home/wwwroot/weicot/lib/Zend/Db/Adapter/Pdo/Abstract.php on line 342
大概是说pdo模块不见了 需要他才能刷行 至于pdo是什么 请自行谷歌 顺带吐槽一下 用百度搜出来的结果不怎么靠谱啊 特别是百度自家的结果 参考那玩意等于是拿自家服务器开玩笑啊
于是我首先打印了phpinfo 的结果发现里面是有这个结果的 于是我把mage的日志过一遍发现没什么异常
然后又把 linux mysql php 等等日志都看一边没发现什么异常
于是我写一段代码用来测试连接数据库 以下是代码片段
/* *www.weicot.com *1050653098@qqcom *0.1.3 *No 14 */ var_dump(extension_loaded('pdo')); echo "<br />"; //获得加载项 //(get_loaded_extensions()); exit(); $db= new PDO('mysql:host=localhost;dbname=weicot', 'jianger', 'jianger150930'); $dbo = $db->query("select * from USEname"); while($row=$dbo->fetch()){ print_r($row); } echo "<br />"; print_r(get_loaded_extensions()); exit(); echo "<br />"; 一切正常 然后我纳我有测试了这个 $con = mysql_connect('localhost:/tmp/mysql.sock', 'jianer', 'jianer150829'); if(!$con){ die("cound no connect:".mysql_error()); } mysql_select_db("weicot",$con); $sql="CREATE TABLE NAME( Name varchar(15), Remark varchar(16), No int )";
还是一切正常 好吧都正常 于是我就去问题的出处找问题
找到开始报错的地方这边需要点 zen 框架 的知识可以自己去谷歌
找到 /home/wwwroot/weicot/lib/Zend/Db/Adapter/Pdo/Abstract.php:
通脚本打印发现 这段代码上面几个方法是有加载pdo的 而下面几个方法 为 false 也就是没加载到
于是我尝试用php 打印php.ini 位置
throw new Zend_Db_Adapter_Exception(var_dump(get_cfg_var('cfg_file_path'), extension_loaded('pdo_mysql'))); throw new Zend_Db_Adapter_Exception('pdo_mysql extension is not installed. php.ini:'. get_cfg_var('cfg_file_path')); throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); }
发现php.ini 的加载位置不对 他是在ect 目录加载的 而我的web 的php.ini 是在 usr 目录下
于是我尝试 直接用ln 创建一个软连接 发现并没有效果 也可以这样测试 php –c php.ini地址
于是我用 php –m 打印加载的模块发现并没有pdo 的踪迹 于是我重新编译pdo 的模块 然后重新配置
发现pdo是有了 但又报新的错误 utf8 问题 也就是编码问题
于是我写了个脚本用于跟踪所有的输出包括zen 底层的输出 对问题做了个汇总
发现 是php cli 模式的问题 用php –v可以的出版本以及其他信息
由于 命令行 cli 和 web sever cgi 的 可以分开安装的 所以由此可以推出
这两个的 可用命令数量和模块也不近相同
通过脚本输 的结果可以发现 cli 执行命令的目录 和cgi 的目录不在同一个目录
如下
Cli /usr/bin/php Cgi /usr/local/php/bin/php 于是我尝试这样用 cgi 的来刷新 /usr/local/php/bin/php -f /home/wwwroot/weicot/shell/indexer.php reindexall
由于产品比较多 刷了一会
发现 可以索引了
但索引了几条后 有爆了一个pdo 错误 但这个错误跟环境无关
是一个主表错误 因为 以前有俩个pdo 模块连接过
报这个错误也在预料之中 这个也比较好解决的 我就不说咯
所以啦 ln -s /usr/local/php/bin/php /usr/bin/php 这条命令完美的解决了上述问题
最后我吧 linux php nigx mysql py gcc 的依赖关系都过了一遍
还有php 的各种模式 最后问题解决 索引工作正常