2010-02-02 7 views
3

мой скрипт использует curl для загрузки изображений на smugsmug сайт через smugsmug api. Я прохожу через папку и загружаю каждое изображение. но после 3-4 загрузок curl_exec завершится с ошибкой, остановит все и предотвратит загрузку других изображений.завиток завершает выполнение сценария

$upload_array = array(
    "method" => "smugmug.images.upload", 
    "SessionID" => $session_id, 
    "AlbumID" => $alb_id, 
    "FileName" => zerofill($n, 3) . ".jpg", 
    "Data" => base64_encode($data), 
    "ByteCount" => strlen($data), 
    "MD5Sum" => $data_md5); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $upload_array); 
curl_setopt(
    $ch, CURLOPT_URL, 
    "https://upload.smugmug.com/services/api/rest/1.2.2/"); 
$upload_result = curl_exec($ch); //fails here 
curl_close($ch); 

обновление: поэтому я добавил вход в мой сценарий. когда он завершается неудачно, каротаж останавливается после fwrite ($ fh, "begin curl \ n");

fwrite($fh, "begin curl\n"); 
$upload_result = curl_exec($ch); 
fwrite($fh, "curl executed\n"); 
fwrite($fh, "curl info: ".print_r(curl_getinfo($ch,true))."\n"); 
fwrite($fh, "xml dump: $upload_result \n"); 
fwrite($fh, "curl error: ".curl_error($ch)."\n"); 

Я также

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60*60); 
+2

Возникли ли какие-либо ошибки? Возможно, ваш сценарий превышает его временные ограничения. –

+3

У вас есть сообщения об ошибках и отображение ошибок или ведение журнала? Вы использовали curl_getinfo() и curl_errmsg()? – GZipp

ответ

3

Не уверен, что вопрос ... Что в ответ, когда он терпит неудачу? Что говорят журналы системы и apache?

Теперь, если бы я был вами, я бы не использовал curl_init() и curl_close() в цикле. вместо этого я бы инициализировал перед циклом и закрылся после цикла - тогда в цикле itsef я бы использовал curl_set_opt, чтобы установить URL-адрес и различные параметры и просто позвонить curl_exec(). Это может быть даже вопрос об этих ручках, превышающих какой-то системный предел или что-то в этом роде. Если вам нужно/нужно использовать несколько соединений, вы можете использовать curl_multi или написать некоторые функции управления/класс для управления несколькими дескрипторами.

+0

У меня нет доступа к журналу apache. он просто остановился. –

+1

@prodigitalson - Я думаю, вы хотели сказать «... Я бы не использовал curl_init() и curl_close() в цикле». – GZipp

+0

@GZipp: да. исправленный. – prodigitalson

1

Нам может понадобиться дополнительная информация, прежде чем мы сможем помочь, но похоже, что это может быть проблема с таймаутом.

Включите отчет об ошибках или проверьте свои журналы ошибок, чтобы узнать, что-то поднимается.

Попробуйте установить длинный Curl тайм-аут с CURLOPT_TIMEOUT

Также убедитесь, что ваш тайм-аут сценария достаточно или увеличить с set_time_limit()

0

Вы можете попробовать ли непосредственно работает вывод curl_error():

$upload_result = curl_exec($ch); //fails here 

$error = curl_error($ch();  
if ($error) echo "CURL Error: $error"; 

curl_close($ch); 

Если не поможет, проверьте phpinfo();, чтобы узнать, отключена ли отчетность об ошибках по всему миру (найдите настройку display_errors).

0

В CURL включены опции «multi» (для нескольких ресурсов), когда вы работаете с несколькими запросами с высокой задержкой (например, загружаете изображения).

См: http://www.php.net/manual/en/function.curl-multi-exec.php и вся библиотека функций Multi, описанная здесь: http://php.net/manual/en/book.curl.php

Для полного примера разделе многократных ресурсов библиотеки, см: http://www.developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/

0

1- Force Curl, чтобы рассказать вам немного больше о том, что он делает

curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 

2- Если вы не в безопасном режиме, убедитесь, что PHP отображает ошибки, помещая это в начале вашего скрипта:

<?php 
ini_set('display_errors', '1'); 
error_reporting(E_ALL); 

3- Вы также можете попытаться запустить скрипт в режиме командной строки.

4- Наконец, если вы не находитесь в безопасном режиме, вы можете попробовать запустить бинарник curl, используя exec().

<?php 

$curl_str = "curl -k -o /my/path/curl_output.log -d 'var1=".$value1."&var2=".$value2."& etc...' https://upload.smugmug.com/services/api/rest/1.2.2/"; 
$r = exec($curl_str); 
Смежные вопросы