PHP在浏览器中工作,而不是cron


PHP works in browser but not cron

我需要帮忙,因为我快疯了!我有一个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对数组的建议