2015-09-06 10 views
1

Мне нужно помочь здесь, потому что я сошел с ума! У меня есть PHP-скрипт, который, насколько я могу судить, работает, когда он был создан, как в браузере, так и через cron/cli. Однако это недавно перестало работать по какой-то причине, и после расследования он возвращает ошибку «Неопределенная переменная» :(PHP работает в браузере, но не cron

Итак, я просмотрел файлme.php, который называется checklogin.php, который, в свою очередь, вызывает функции .inc. php.

При запуске непосредственно из браузера скрипт выполняется из конца в конец и выполняет все действия, для которых он был создан. Однако, когда я запускаю это в cron с помощью «/ usr/bin/php /bla/cron_updateviewed.php », он возвращает сообщение об ошибке ...

PHP Примечание: Undefined переменной: матч в /bla/bla/functions.inc.php на линии 79

Что еще более раздражает для меня, у меня есть много других скриптов, все из которых запускаются из cron, вызывая одну и ту же функцию таким же образом, без ошибок.

Это мой 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; 
} 

Как я уже сказал, Viewed.php работает при доступе из браузера, но только не cron. Также важно добавить, что через браузер ничего не пропускают, как POST или GET, что помешает этому работать.

У меня есть другие скрипты, такие как checkinbox.php, который использует функцию striplinks fron cron без каких-либо проблем.

Я действительно в убыток, чтобы WTF происходит :(

Обновлено

решаемые "неопределенная переменная" вопрос, но все-таки возвращается Nill

Как было предложено регулярное выражение не было выполнено, поэтому я добавил $ match = array() в функцию перед циклами while. Это исправляет неопределенную ошибку переменной, но она все равно возвращает 0.

После настройки нескольких тестовых сценариев, которые я обнаружил при выполнении кода, хотя браузер, используются куки-файлы в curl. Однако при выполнении через 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); 

Что-то случилось с ним, почему печенье не используются при выполнении через хрон/кли?

+1

вы подталкиваете значения к '$ match' без инициализации (например,' $ match = []; '), вы, вероятно, получаете такое же предупреждение в браузере, но оно подавляется. тем не менее, его просто уведомление, поэтому оно не должно ломаться. – chiliNUT

ответ

1

Таким образом, после более 4 часов проб, ошибок и гнева я, наконец, решить эту проблему. Похоже, что CURL требует полного пути к файлам cookie, если вы собираетесь выполнять из cli или cron. Странно, но там вы идете: P

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

Спасибо @Siguza за предложение массива тоже.

2

Моя ставка является то, что обе ваши while петли или в if s они содержат не запускали, и $match остается неопределенным, вызывает ошибку в return.
Вы можете исправить это путем инициализации $match пустой массив так:

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

Вы правы, добавив $ match = array(); решает проблему, но функции по-прежнему возвращают 0 результатов при прохождении через cron/cli, но 69 при запуске через браузер. Я не понимаю, в чем разница :( –

+0

Я думаю, что проблема связана с тем, что CURL не использует файлы cookie правильно и, следовательно, загружает неправильную веб-страницу, где ссылки не возвращаются. См. Обновление выше. –

Смежные вопросы