Apache же блокировка запроса orgin - PullRequest
1 голос
/ 02 ноября 2011

Когда я пытаюсь загрузить две одинаковые страницы со своего сервера в разные вкладки одного и того же браузера, он ждет завершения одной из них, прежде чем запускать другую. Это нормально, но у меня есть процесс cron, который должен вызывать несколько вызовов одного и того же сценария, и у меня не может быть такого типа блокирующего поведения. Я думаю, это потому, что процесс имеет один и тот же сеанс / соединение с сервером, и поведение по умолчанию - разрешать только один запрос за раз из одного и того же источника ... как я могу обойти это? Я хочу, чтобы процесс cron мог запускать вызовы одного из моих сценариев, а apache запускал новый экземпляр целевого сценария для обработки запроса каждого из них. Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Вы используете стандартные файловые сессии PHP? PHP блокирует сеанс, когда вы выполняете session_start(), и удерживает файл заблокированным до выхода из сценария, или вы делаете session_write_close().

Это позволяет предотвратить обслуживание любых ДРУГИХ страниц с поддержкой сеанса, поскольку они не могут получить доступ к файлу сеанса, пока не будет снята блокировка.

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

По сути, у вас будет

<?php

session_start(); // populate $_SESSION;
session_write_close(); // relinquish session lock

.... dome some really heavy duty long computations

session_start();
$_SESSION['somekey'] = $new_val;
0 голосов
/ 18 мая 2013

Не думаю, что есть какие-то проблемы с php continue, на самом деле мне нравится, как он себя ведет

Use continue 2;потому что continue будет работать так же, как и тормоз в коммутаторе, и циклы for, while, foreach и т. д. продолжат свое движение после выхода из коммутатора.

В следующем примере будет отображаться только 1, потому что яОтключение от выключателя и продолжение передней части.


$un_array=array(1,2);

foreach($un_array as $num)
{
    switch($num)
    {
        case 1:
        //nothing
        break;
        case 2:
            continue 2;
        break;
    }

    echo $num;

}

exit;
...