PHP适用于浏览器,但不适用于cron

时间:2015-09-06 16:44:59

标签: php

我需要在这里帮助因为我疯了!我有一个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有什么问题?

2 个答案:

答案 0 :(得分:2)

我敢打赌,您的while循环或其中包含的if永远不会运行,并且$match未定义,导致return错误。
您可以通过将$match初始化为空数组来解决此问题,如下所示:

function striplinks($document) {
    $match = array(); // also possible for PHP5.4 and later: $match = [];

答案 1 :(得分:1)

经过4个多小时的试验,错误和愤怒,我终于解决了这个问题。如果您要从cli或cron执行,则CURL似乎需要cookie文件的完整路径。很奇怪,但你去了:P

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/full/path/cookie.txt');

感谢@Siguza的数组建议。