繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM