通过cron执行脚本时,使用Zend-Lucene的PHP iconv错误,但不是在命令行上



我通过命令行执行一个PHP脚本,对于特定用户来说,该脚本在命令行上执行时运行良好,但当完全相同的命令放入同一用户的crontab中时,会返回一个PHP iconv错误。

命令行使用Yii框架和Zend-Lucene库,但我不确定这是否相关。

我已经在crontab行中使所有可执行文件和脚本路径都是绝对的,并且可以验证它在直接在命令行上执行时是否有效。

我将实际的PHP调用封装在一行shell脚本中,正如我在这里的其他地方读到的那样,这为某人解决了类似的问题,但并不令人高兴。

在命令行上成功执行的命令是:

/bin/sh /var/www/yii-projects/projectname/protected/scripts/buildIndex.sh >> /var/lucene/lucene.log

buildIndex.sh脚本的内容是:

/usr/bin/php /var/www/yii-projects/projectname/protected/scripts/cron.php lucene buildIndex

crontab行是:

*/10 * * * * /bin/sh /var/www/yii-projects/projectname/protected/scripts/buildIndex.sh >> /var/lucene/lucene.log

执行crontab时,日志中显示的错误为:

PHP Error[8]: iconv(): Detected an illegal character in input string
    in file /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php at line 58
0 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php(58): iconv()
1 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Analysis/Analyzer.php(125): Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive->reset()
2 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php(98): Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive->setInput()
3 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Index/Writer.php(244): Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter->addDocument()
4 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene.php(1410): Zend_Search_Lucene_Index_Writer->addDocument()
5 /var/www/yii-projects/projectname/protected/vendors/Zend/Search/Lucene/Proxy.php(500): Zend_Search_Lucene->addDocument()
6 /var/www/yii-projects/projectname/protected/commands/LuceneCommand.php(97): Zend_Search_Lucene_Proxy->addDocument()
7 unknown(0): LuceneCommand->actionBuildIndex()
8 /var/www/yii-projects/yii-1.1.12.b600af/framework/console/CConsoleCommand.php(173): ReflectionMethod->invokeArgs()
9 /var/www/yii-projects/yii-1.1.12.b600af/framework/console/CConsoleCommandRunner.php(68): LuceneCommand->run()
10 /var/www/yii-projects/yii-1.1.12.b600af/framework/console/CConsoleApplication.php(92): CConsoleCommandRunner->run()
11 /var/www/yii-projects/yii-1.1.12.b600af/framework/base/CApplication.php(162): CConsoleApplication->processRequest()
12 /var/www/yii-projects/projectname/protected/scripts/cron.php(14): CConsoleApplication->run()

考虑到所采取的措施,以及用户在这两种情况下是相同的,我想不出有什么原因会有任何差异

请帮忙!

感谢

编辑-我还应该确认正在索引的底层数据没有改变-我已经多次交替执行这两种场景,并一致地获得了上述结果。

使用-f开关并直接从crontab:尝试

/usr/bin/php -f /var/www/yii-projects/projectname/protected/scripts/cron.php lucene buildIndex

此外,你确定你正在传递的命令的文本是UTF8吗?那里还有其他符号吗?也许是BOM?你可以用HEX编辑器检查一下——打开你的shell脚本,省略所有的字母,看看剩下什么。UTF8中的BOM通常是EF BB BF,但它可能根本不是BOM。只要检查一下。

必要的shell环境变量对crontab作业不可用,因此将其添加到irishhp用户的crontab:中

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
LANG=en_US.UTF-8

问题解决了。

最新更新