2015-11-13 3 views
0

У меня есть PHP-скрипт, который получает и отправляет большой объем данных через API. Он работает правильно, но API, который иногда вызывает мой скрипт, возвращает мне 500 Ошибка сервера. В этом случае я хотел бы написать свой сценарий restartКак сделать вызов скрипта

Как я могу это сделать? Я пробовал header("Location: http://example.com/myscript.php");, но без успеха.

EDIT (из 6 человек щелкнул поставить этот вопрос на удержание):

  • нормально, так что у меня есть myscript.php, который должен работать как кронтаб ..

  • этот myscript.php отправляет большой объем данных внешнему/удаленному API (это не мой API, поэтому я не могу исправить проблемы здесь). Но API иногда ломается после различного количества данных. . (tha данные, которые я отправляю, я проверил и v alidated)

myscript.php во-первых, спрашивает API, какие данные были уже посланный к нему и пропускает, что, таким образом, когда myscript.php может перезагрузится, он будет когда-нибудь закончится :)

+2

Если перерывы сценария, то он не будет точно делать что-нибудь еще , Я бы попытался определить, почему сценарий ломается в первую очередь, и сосредоточиться на его исправлении. – FrankerZ

+2

Обычно, когда сценарий прерывается, он останавливается, и вы не можете запускать больше кода. Вам нужно будет использовать что-то вроде javascript для выполнения вызова ajax, и если вызов ajax возвращает ошибку 500, javascript может повторно запросить страницу. Как сказал Францер, выясните, почему он вызывает ошибку и решает это. Вероятно, вы увидите проблему в журнале ошибок (от верхней части головы я бы сказал, максимальное время выполнения). –

+0

Переадресация «Расположение» заставляет браузер выдавать 'get' на указанном URL-адресе. если сценарий изначально был вызван с помощью POST, то вы не вызываете его таким же образом, НЕ передаете какие-либо данные, и т. д., например. перезапуск таким образом, по сути, бессмыслен. –

ответ

4

Похоже, вы не говорите, что ваш скрипт терпит неудачу, но ваш скрипт использует веб-API, который изредка терпит неудачу.

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

С другой стороны, если API случайным образом терпит неудачу, когда вы отправляете ему данные, с которыми оно будет успешным при последующих запросах, лучше всего прекратить использование API.

Если вы застряли с ним по какой-либо причине, и хотите просто повторить вызов вместо того, чтобы прервать свой сценарий, я думаю, вы могли бы сделать это, не перезапустив весь скрипт.

$max_attempts = 4; // Decide on a reasonable number of times to retry the call 

while ($max_attempts--) { 
    // Try the API call up to the specified maximum number of attempts 
    $returned_data = $api->call($sent_data); 
    // Stop trying when you get a successful response 
    if ($returned_data != '500 Server Error') break; 
} 

Если случайный отказ является относительно нечастым, этот подход должен значительно снизить общую частоту отказа. И если вам нужно повторить некоторые части вашего кода перед вызовом API при последующих попытках, вы можете просто включить их в цикл повтора.

Если вы добираетесь до максимального количества попыток и не располагаете хорошими данными, то, вероятно, происходит что-то необычайно плохое, поэтому вам, вероятно, следует перестать пытаться.

if ($returned_data == '500 Server Error') die ("The API probably isn't working at all"); 

Теоретически, если есть способ, чтобы перезапустить весь ваш скрипт каждый раз, когда не удался вызов API, а затем, если API даже перестанет работать, похоже ваш скрипт перезагрузится в бесконечном цикле.

2

Выполните curl вызов yourserlf, затем exit();

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://example.com/myscript.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
curl_exec($ch); 
curl_close($ch); 
exit(); 

Это приведет к еще instanse вашего сценария, чтобы начать (вы называете свой адрес с ГЭТ), заставить этот вызов, чтобы умереть через 5 секунд вместо ожидая окончания другого экземпляра, затем exit(); с тем, что текст, который вы можете

EDIT: Кроме того, возможно, потребуется установить ignore_user_abort(true), чтобы сохранить ваш новый сценарий от смерти, когда вы остановить локон вызов для выполнения Выйдите

+0

Могу я знать, для чего нужен downvote? он точно отвечает на вопрос. – Elentriel

+0

Этот шаблон лучше всего избегать. По умолчанию PHP-скрипты не выполняются, если 'ignore_user_abort()' не установлен, поэтому дочерний скрипт перестанет работать через 5 секунд. Хуже того, если вы не очень внимательно относитесь к тому, как вы это используете, вы можете столкнуться с большим количеством запросов, запущенных одновременно, что может привести к сбою сервера. – duskwuff

+0

... Кроме того, некоторые среды размещения могут не разрешать веб-сайтам делать рекурсивные вызовы сами по себе или могут ограничить количество одновременных запросов PHP. Использование этого кода не будет работать в такой среде. – duskwuff

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