Ошибка сегментации в простом коде Gearman. PHP-клиент

Это очень грустная история. Я пытаюсь начать использовать Gearman в своем проекте. Но не может запустить простой тест.

root@140141-10009:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.1 LTS"

PHP

root@140141-10009:~# php -v
PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli) (built: Sep 12 2012 18:59:41)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

Gearman

root@140141-10009:~# gearmand -V
gearmand 0.34 - https://bugs.launchpad.net/gearmand

PHP PECL Gearman 1.1.0, собран из исходников без ошибок. Все (2) теста пройдены. Никакие другие расширения PHP не включены.

клиент.php:

<?php
$client = new GearmanClient();
$client->addServer('127.0.0.1');
$client->setTimeout(10000);
$client->addTask('taskplus2', 10);
$client->addTask('taskplus2', 15);
$client->runTasks();

Ошибка:

root@140141-10009:~/gearman/proto# php client.php
Segmentation fault

dmesg:

[15066.824900] php[20520]: segfault at f ip 00007f128470ba40 sp 00007fffd9f1dd28 error 4 in libc-2.15.so[7f12845c1000+1b5000]

Я уже пробовал PHP 5.3, 5.4, Ububtu 10.04, 12.04, используя gearman-ppa и не используя. Я также пробовал PECL Gearman 0.8.1, 0.8.3, 1.0.2, 1.0.3, 1.1.0. Установка всего этого для чистой установки Ubuntu. Поиск в Google libc6 gearman не дал результатов.


person Stanislav Gamayunov    schedule 28.11.2012    source источник


Ответы (2)


Метод GearmanClient::addTask() принимает в качестве второго параметра строку, а не целое число.

Пытаться:

$client->addTask('taskplus2', serialize(10));
person Goran Miskovic    schedule 18.12.2012
comment
Да это правильно. Спасибо. И почему он не выдает исключение вместо segfault... - person Stanislav Gamayunov; 19.12.2012
comment
И это PHP... насколько сложно было бы расширению преобразовать скалярный тип в строку для вас? Давайте авторы расширений. - person rdlowrey; 23.03.2013
comment
Сделать это нетрудно, но в корне неверно: в качестве аргумента могут передаваться не только скаляры, но и объекты; Возможно, я захочу использовать строку в кодировке JSON, кто-то другой может использовать строку XML, вы можете предпочесть сериализованную строку PHP. Однако выдача предупреждения или выдача исключения в случае, если строка не передается в качестве аргумента, будет полезна. - person Goran Miskovic; 23.03.2013

Попробуйте обновить версию gearmand до 1.1.2 с официального сайта.

person Kirill Zorin    schedule 13.12.2012
comment
Спасибо. Я попробовал несколько версий сервера и расширения, но все они были затронуты. - person Stanislav Gamayunov; 19.12.2012