Отправить заявку

Асинхронное выполнение php-скриптов

Бывает, что в процессе работы какого-то скрипта необходимо выполнить другой скрипт и ждать, пока он закончит свою работу. Например. В шапке нашего скрипта будет код, который производит поиск по XML файлу нужной, уникальной, строки и если ее нет - добавляет ее (например это строка IP адреса пользователя и USER_AGENT). Так вот - пока этот скрипт отработает - пройдут секунды - зачем пользователю ждать это время, ведь ему нужно увидеть загруженный сайт сразу, ведь результат работы скрипта не повлияет на дальнейшую работы пользователя на сайте.

Есть несколько вариантов решения этого вопроса. Один из них - сокеты.

function RunAsynchronous($url, $options= array())
{
    $parts = parse_url($url);
     if (!$open = fsockopen($parts['host']))
    {
        return false;
    }
    $data = http_build_query($options, '', '&');
    fwrite($open, "POST " . (!empty($parts['path']) ? $parts['path'] : '/') . " HTTP/1.1\r\n");
    fwrite($open, "Host: " . $parts['host'] . "\r\n");
    fwrite($open, "Content-Type: application/x-www-form-urlencoded\r\n");
    fwrite($open, "Content-Length: " . mb_strlen($data,"UTF-8") . "\r\n");
    fwrite($open, "Connection: Close\r\n\r\n");
    fwrite($open, $data);
    fclose($open);
    return true;
}

Пример использования:

RunAsynchronous('/asynchronous-script.php', array('time' => time()));

В asynchronous-script.php будет доступен $_POST['time']. т.к. в функции RunAsynchronous $options у нас массив, мы можем передавать сколько угодно параметров.

Другие публикации