PHP - выполнение дорогого кода после отправки заголовков перенаправления HTTP - PullRequest
1 голос
/ 21 марта 2012

Я ОЧЕНЬ новичок в PHP, сейчас я работаю над сервисом, часть которого включает короткие URL, у меня все настроено нормально с помощью перенаправления заголовка:

<?php

if (code_exists($code)) {
    // this code gets url for redirect:
    $url_query = mysql_query("SELECT * FROM urls WHERE code = '".$code."'");
    $url = mysql_result($url_query,0,'url');
    $id = mysql_result($url_query,0,'url_id');

    // this code redirects user
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Thu, 1 Jan 1970 00:00:00 GMT");
    header( "HTTP/1.1 301 Moved Permanently" );
    header( "Location: ".$url );

    // this code executes a function, takes 3 - 4 seconds to return
    $affected = dostuff($id);

} else {
    echo "Code Error: ".$code;
}

?>

Строка $affected = dostuff($id); вызывает несколько внешних API и записывает результаты в таблицу mysql (часто более 100 строк).

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

Можно ли как-нибудь собрать и отправить заголовки пользователю без остановки выполнения кода?

В качестве альтернативы есть способ «запустить» другой скрипт, но передать ему параметр $id?

Я бы предпочел избегать использования заданий CRON, если это возможно, так как они запутывают меня до чертиков:).

Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Здесь есть описание: https://www.zulius.com/how-to/close-browser-connection-continue-execution/

Короче говоря, вам нужно отправить заголовки, чтобы сообщить браузеру о закрытии соединения, заставить HTTP-сервер отправлять данные в браузер,и запретить PHP синхронизировать сценарий.

Недостатком этого метода является то, что один из ваших рабочих потоков HTTP используется для обслуживания этого запроса.При достаточном количестве запросов вы можете легко исчерпать рабочие потоки, чтобы иметь возможность обслуживать запросы.Еще один способ взглянуть на это - если кто-то захочет атаковать ваш сервер, вызов URL-адреса для запуска этого процесса во много раз как можно быстрее быстро поставит ваш сервер на колени.

0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...