2012-03-16 4 views
1

Я пишу curl php script, работа которого загружается csv-файл с одного веб-сайта после успешного входа в систему. Он отлично работает, когда я запускаю его в своем браузере, но он терпит неудачу, когда я ставлю он в списке заданий cron. Я видел ошибку памяти из-за ошибок в моем журнале один раз, поэтому я думаю, мой сервер дает мне меньше памяти для cron.curl php download script отлично работает в браузере, но не работает cronjobs

Как я могу обойти эту проблему?

Вы можете увидеть часть кода, который делает скачать работу, это просто обычная:

<?php 
... 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields); 
$fp = fopen("data.csv", "w"); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_exec ($ch); 
curl_close ($ch); 
fclose($fp); 

Просто хочу еще раз сказать, что это часть кода, и все отлично работает в браузере и не в cron jobs.

+0

Что 'crontab' запись (при условии, что это ОС Linux)? –

+0

0 */1 * * * cd/home7/philbike/public_html/atlanticauto/assets/components/cronmanager/&& php cron.php, но это будет расширение modx, выполняющее фрагмент. – electroid

+0

Просто мысль - есть разные php.ini. Это отличается от исполнения из командной строки (например, cronjobs). –

ответ

0

Наконец-то все работает с моими настройками: cd /home7/philbike/public_html/atlanticauto/assets/components/cronmanager/ && php cron.php.

Я должен написать путь к файлу CSV, как это без использования системных переменных:

/home7/philbike/public_html/atlanticauto/data.csv 
1

Обычно это означает, что вы конфигурируете PHP (php.ini) не то же самое при вызове вашего сервера и при вызове по командной строке. Я не уверен, что это лучшая практика, но я обычно делаю свой cronjob, вызывающий wget на своих сценариях, чтобы убедиться, что они работают в той же среде, в которой я их тестировал, то есть через веб-сервер.

# m h dom mon dow command 
    * * * * * wget -O - http://myapp.example.com/cron/run > /dev/null 2>&1 

Символ * показывает, что команда будет работать на любой:

  • минут
  • час
  • день месяца
  • месяц
  • день недели

Опция -O указывает, что wget не записывает выходные данные сценария в файл «>/dev/null 2> & 1« просто перенаправить вывод скрипта, чтобы избежать поведения по умолчанию cron (который для отправки электронной почты с выходом команды пользователям).

+0

Как это будет выглядеть в моем случае? Я имею в виду, что я выполняю 0 */1 * * * cd/home7/philbike/public_html/atlanticauto/assets/components/cronmanager/&& php cron.php, просто добавьте wget -O? – electroid

+0

Нет, конечно, нет ... wget ждет URL-адреса, который вам нужно просто поместить URL-адрес, который вы положили в свой браузер, чтобы проверить. (Я объясню свой ответ, чтобы объяснить это). – AsTeR

+0

Хорошо, я думаю, я понимаю. Но точка, в которой я не могу использовать свой сценарий, как во время соображения безопасности. Я имею в виду, что скрипты запускаются в браузере, если я зарегистрирован как администратор в рамках modx, но он не может быть выполнен, но кто-либо еще. – electroid

0

Как насчет команды "php /home7/philbike/public_html/atlanticauto/assets/components/cronmanager/cron.php"? Он работает в вашем терминале?

+0

Да, он отлично работает. Я вижу сообщение журнала в modx framework, которое показывает мне, что мои фрагменты выполняются. – electroid

1

Предполагая, что вы используете стандартную конфигурацию CRON, ваш cwd (текущий рабочий каталог) ~/ или / или что-то подобное, однако, когда вы запускаете скрипт из Интернета ваш cwd установлен в dir(__FILE__) (текущий сценарий каталог).

Допустим, вы используете скрипт /var/www/web1/scripts/script1.php, чем:

  • перемычками УХО = /var/www/web1/scripts/
  • CRONs УХО = /var/www

При использовании относительного имени файла, такие как data.csv (без / на начало) полный путь создается как CWD . $filename, поэтому:

  • холсты полный путь /var/www/web1/scripts/data.csv
  • CRONs полный путь /var/www/data.csv

Вы можете легко избежать с помощью:

define('PATH_ROOT', dirname(__FILE__) . '/'); 
// ... 
curl_setopt ($ch, CURLOPT_COOKIEJAR, PATH_ROOT . 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, PATH_ROOT . 'cookie.txt'); 
// ... 
$fp = fopen(PATH_ROOT . "data.csv", "w"); 

Кроме того, убедитесь ваш пользователь система подключения и скрипт будет работать на всех (проверьте CRON долго или отправьте электронное письмо).

+0

Если я буду использовать «/» в начале моего файла, например «/data.csv», если он отлично работает, если файл находится в каталоге public_html? – electroid

+0

@electroid Он будет использовать корень файловой системы, вы должны либо использовать '/ var/www/public_html/data.csv', либо (предполагая, что ваш скрипт находится в'/var/www/public_html/scripts/sub/cron.php') 'dir (__FILE__). '/../../ data.csv'' – Vyktor

+1

в любом случае я все же попытаюсь выполнить его с помощью $ _SERVER [' DOCUMENT_ROOT ']. я постараюсь сделать это таким образом. – electroid

1

Как обходной путь, вы можете выполнить это в браузере без необходимости изменять скрипт PHP. Например:

30 * * * * /usr/bin/lynx -source http://mypage/status/cron > /dev/null

Он будет вести себя так же, как и в браузере, и позволит избежать вам приходится возиться с кодом и экологии.

В качестве альтернативы вы можете использовать wget вместо этого PHP-скрипта.

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