我需要帮忙,因为我快疯了!我有一个PHP脚本,据我所知,它是工作时,在浏览器和通过cron/cli。然而,由于某种原因,这最近停止工作,经过调查,它返回一个"未定义的变量"错误:(
我有viewedme.php,它调用checklogin.php,然后调用functions。inc.php。
当直接从浏览器运行时,脚本从端到端执行并执行它设计的所有操作。然而,当我在cron中使用"/usr/bin/php/bla/cron_updateviewedd .php"运行此命令时,它返回此错误消息…
PHP注意:未定义变量:匹配/bla/bla/functions.inc.php第79行
更让我恼火的是,我有许多其他脚本,它们都是从cron运行的,以相同的方式调用相同的函数,没有错误。
This is my viewedme.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;
}
就像我说的,view .php在从浏览器访问时都是工作的,但不是cron。同样重要的是要添加,没有像POST或get这样通过浏览器传递的东西会阻止此工作。
我有其他脚本,如checkinbox.php,它使用的striplinks函数从cron没有任何问题。
我真的不知道发生了什么事
解决了"变量未定义"问题,但仍然返回nil
建议正则表达式没有被执行,所以我添加了$match = array();到while循环之前的函数中。这修复了未定义变量错误,但它仍然返回0。
在设置了几个测试脚本后,我发现在通过浏览器执行代码时,使用curl中的cookie。然而,当通过cron/cli执行时,它们不被使用,因此显示一个不同的网页。
这是我的curl代码…
$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);
有什么问题,为什么cookie不使用时,通过cron/cli执行?
我打赌你的while
循环或它们包含的if
s从未运行,$match
保持未定义,导致return
上的错误。
您可以通过将$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对数组的建议