Семафоры PHP, вызывающие сбои? - PullRequest
0 голосов
/ 26 августа 2011

На наших веб-серверах происходили случайные сбои PHP-запросов для некоторых запросов, связанных с семафорами. Мы отследили и предположили, что запрос где-то умер из-за функций sem _ * () в PHP, но мы не смогли найти что-то полезное из журнала ошибок. Мы находимся на PHP 5.3.6 на 64-битных машинах Linux. Код работает так:

    $sem_id = @sem_get(123457, 1);
    if (!$sem_id) return;
    $sem_retval = @sem_acquire($sem_id);
    if (!$sem_retval) return;
    $shm_id = shmop_open(ftok('/some/path', 'h'), 'c', 0666, 8192);
    if ($shm_id === FALSE) { @sem_release($sem_id); return; }
    $str = shmop_read($shm_id, 0, 8192);
    // ... some operations that may result in changes to $data
    if ($data_updated) {
        shmop_write($shm_id, str_pad(serialize($data), 8192, "\0"), 0);
    }
    @shmop_close($shm_id);
    @sem_release($sem_id);
    @sem_remove($sem_id);

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

Есть ли какие-либо идеи о том, что может быть причиной? Кроме того, я не уверен, что делает sem_remove (), поскольку я не нашел аналога системного вызова.

P.S. Мы удалили все операторы, содержащие sem _ * (), и, похоже, проблема больше не возникает.

1 Ответ

0 голосов
/ 27 августа 2011

Вам нужно ОСТАНОВИТЬ, используя @ -оператор, прямо сейчас. Это маскирует любую ошибку и игнорирует ее, даже если это приводит к фатальному выходу.

Оператор @ - одна из худших функций PHP.

Если произойдет ошибка, потому что вы используете оператор @, у вас нет возможности узнать, что это было, или даже что это вообще произошло, потому что ваш скрипт будет либо работать независимо, либо завершится без Достоинские данные. Это применимо даже в том случае, если у вас настроено ведение журнала ошибок и максимальный уровень error_reporting.

...