[英]PHP works in browser but not cron
我需要在这里帮忙因为我疯了! 我有一个PHP脚本,据我所知,它在浏览器和cron / cli中都可以正常工作。 然而,这最近由于某种原因停止工作,并在调查后返回“未定义的变量”错误:(
所以,我有一个名为checklogin.php的browseme.php,后者又调用了functions.inc.php。
当直接从浏览器运行时,脚本从头到尾执行并执行它为其设计的所有操作。 但是当我使用“/ usr / bin / php /bla/cron_updateviewed.php”在cron中运行它时,它会返回此错误消息...
PHP注意:未定义的变量:在第79行的/bla/bla/functions.inc.php中匹配
对我来说更烦人的是,我有许多其他脚本,所有这些脚本都是从cron运行的,以相同的方式调用相同的函数,没有错误。
这是我的seenme.php ...
<?php
include_once('checklogin.inc.php');
include_once('mysqli.inc.php');
$ch = curl_init();
// more curl settings here but removed as not important
$html = striplinks($html);
?>
checklogin.inc.php调用functions.inc.php,其中包含此函数...
// Function to strip down to links
function striplinks($document) {
preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href=
([\"\'])? # find single or double quote
(?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
'isx", $document, $links);
while (list($key, $val) = each($links[2])) {
if (!empty($val))
$match[] = $val;
}
while (list($key, $val) = each($links[3])) {
if (!empty($val))
$match[] = $val;
}
return $match;
}
就像我说的,在浏览器访问时,Viewed.php都在工作,但不是cron。 同样重要的是添加没有任何东西通过浏览器传递,如POST或GET,这将阻止它工作。
我有其他脚本,如checkinbox.php,它使用striplinks函数fron cron没有任何问题。
我真的不知道wtf是怎么回事:(
更新
解决了“未定义变量”问题,但仍然返回nill
正如所建议的那样,正则表达式没有被执行所以我添加了$ match = array(); 进入while循环之前的函数。 这修复了未定义的变量错误,但它仍然返回0。
在设置了一些我通过浏览器执行代码时发现的测试脚本后,使用了curl中的cookie。 但是,当通过cron / cli执行时,它们不被使用,因此显示不同的网页。
这是我的卷曲代码......
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie');
curl_setopt($ch, CURLOPT_URL, 'http://www.bla.com/');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html = curl_exec($ch);
关于为什么在通过cron / cli执行时不使用cookie有什么不对吗?
我敢打赌,你的while
循环或它们包含的if
都不会运行, $match
保持未定义,导致return
错误。
您可以通过将$match
初始化$match
空数组来解决此问题,如下所示:
function striplinks($document) {
$match = array(); // also possible for PHP5.4 and later: $match = [];
经过4个多小时的试验,错误和愤怒,我终于解决了问题。 如果要从cli或cron执行,看起来CURL需要cookie文件的完整路径。 奇怪但你去了:P
curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/full/path/cookie.txt');
感谢@Siguza的数组建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.