Не получается запустить phpdaemon

277 views
Skip to first unread message

Артём Доронин

unread,
Aug 16, 2015, 9:45:07 AM8/16/15
to phpdaemon
PHP 5.5
CentOS 6.x
phpDaemon beta3

Проблема в чём. Ни один из найденных примеров не запустился. Везде одна и та же ошибка. Вот файл конфгурации.
## Config file
 
user group;
group group;

 max-workers 8;
min-workers 1;
start-workers   1;
max-idle    0;
logging         1;
verbose-tty 1;

path 'conf/AppResolver.php';

Pool:Servers\WebSocket {
    enable 1;
    listen 'tcp://0.0.0.0';
    port 8047;
}

Pool:Servers\HTTP {
    enable 1;
    privileged;
    listen 'tcp://0.0.0.0';
    port 8080;
}

\PHPDaemon\Examples\Example {
    enable 1;
}

\PHPDaemon\Examples\ExampleWebSocket {
    enable 1;
}


а вот список ошибок, которые вываливаются

[PHPD] M#31103 \PHPDaemon\Core\Pool:Servers\WebSocket up.
[PHPD] Warning: socket_set_option(): unable to set socket option [92]: Protocol not available in /opt/phpdaemon/PHPDaemon/BoundSocket/TCP.php:93
#1  PHPDaemon\Core\Daemon::errorHandler()
#2  socket_set_option() called at [/opt/phpdaemon/PHPDaemon/BoundSocket/TCP.php:93]
#3  PHPDaemon\BoundSocket\TCP->bindSocket() called at [/opt/phpdaemon/PHPDaemon/Network/Server.php:100]
#4  PHPDaemon\Network\Server->bindSocket() called at [/opt/phpdaemon/PHPDaemon/Network/Server.php:61]
#5  PHPDaemon\Network\Server->bindSockets() called at [/opt/phpdaemon/PHPDaemon/Network/Server.php:33]
#6  PHPDaemon\Network\Server->__construct() called at [/opt/phpdaemon/PHPDaemon/Network/Pool.php:174]
#7  PHPDaemon\Network\Pool::getInstance()
#8  call_user_func() called at [/opt/phpdaemon/PHPDaemon/Core/Pool.php:51]
#9  PHPDaemon\Core\Pool->init() called at [/opt/phpdaemon/PHPDaemon/Core/AppInstance.php:116]
#10 PHPDaemon\Core\AppInstance->__construct() called at [/opt/phpdaemon/PHPDaemon/Core/AppResolver.php:106]
#11 PHPDaemon\Core\AppResolver->getInstance() called at [/opt/phpdaemon/PHPDaemon/Core/AppResolver.php:49]
#12 PHPDaemon\Core\AppResolver->preload() called at [/opt/phpdaemon/PHPDaemon/Thread/Master.php:73]
#13 PHPDaemon\Thread\Master->run() called at [/opt/phpdaemon/PHPDaemon/Thread/Generic.php:127]
#14 PHPDaemon\Thread\Generic->__invoke() called at [/opt/phpdaemon/bin/phpd:69]


это конечно не все, суть как я понимаю во второй строчке. sockent_set_option
поиск этой ошибки в интернете, ничего не дал. 
Очень прошу, помогите. Не первую неделю парюсь и ни чего не получается. 

Vasily Zorin

unread,
Aug 16, 2015, 9:56:59 AM8/16/15
to phpd...@googlegroups.com
Что значит список ошибок? Тут один Warning вываливается, который не влияет на работоспособность.
Просто видать каким-то образом ваша CentOS вот этим кодом — https://github.com/kakserpom/phpdaemon/blob/a176f81834af20ebbd26826d38df1bb67eff148a/PHPDaemon/Core/Daemon.php#L241
определяется как BSD, поэтому демон пытается использовать SO_REUSEPORT и получается Warning.
Выполните, пожалуйста, команду: php -r 'var_dump([php_uname('s'), defined('SO_REUSEPORT') ? SO_REUSEPORT : false]);'
И пришлите результат.

--

---
Вы получили это сообщение, поскольку подписаны на группу "phpdaemon".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес phpdaemon+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Артём Доронин

unread,
Aug 16, 2015, 9:59:13 AM8/16/15
to phpdaemon
PHP Notice:  Use of undefined constant s - assumed 's' in Command line code on line 1
array(2) {
  [0]=>
  string(5) "Linux"
  [1]=>
  bool(false)
}

Vasily Zorin

unread,
Aug 16, 2015, 9:59:59 AM8/16/15
to phpd...@googlegroups.com
Чудеса в решете.

Артём Доронин

unread,
Aug 16, 2015, 10:01:05 AM8/16/15
to phpdaemon
как я понимаю, нет констант. Но что мне делать?

EzheG

unread,
Aug 16, 2015, 10:10:05 AM8/16/15
to phpd...@googlegroups.com
Подтвержадю вывод такого же PHP Notice на CentOS 6 + php 5.4.
Notice не выводится если одинарные кавычки заменить на двойные.
php -r 'var_dump([php_uname("s"), defined('SO_REUSEPORT') ? SO_REUSEPORT : false]);'

16 авг. 2015 г., в 17:01, Артём Доронин <artemich...@gmail.com> написал(а):

как я понимаю, нет констант. Но что мне делать?

Артём Доронин

unread,
Aug 16, 2015, 10:14:18 AM8/16/15
to phpdaemon
заменил на такой:
php -r "var_dump([php_uname('s'), defined('SO_REUSEPORT') ? SO_REUSEPORT : false]);"

вот вывод

array(2) {
  [0]=>
  string(5) "Linux"
  [1]=>
  int(15)
}

Артём Доронин

unread,
Aug 16, 2015, 10:34:12 AM8/16/15
to phpdaemon
так что я не так делаю? подскажите пожалуйста)

EzheG

unread,
Aug 16, 2015, 10:47:57 AM8/16/15
to phpd...@googlegroups.com
Исправление в репе, пробуйте

16 авг. 2015 г., в 18:34, Артём Доронин <artemich...@gmail.com> написал(а):

так что я не так делаю? подскажите пожалуйста)

Vasily Zorin

unread,
Aug 16, 2015, 10:51:13 AM8/16/15
to phpd...@googlegroups.com
Нет, проблема не в этом. Наоборот, константа присутствует хотя не должна.
Там в TCP.php идёт проверка if (defined('SO_REUSEPORT') ...
Так что константа должна отсутствовать (Linux не поддерживает эту BSD-шную фишку), однако порой PHP-константа отсутствует и на BSD, на этот редкий случай предусмотрено лекарство (https://github.com/kakserpom/phpdaemon/blob/master/PHPDaemon/Core/Daemon.php#L241):

if (!defined('SO_REUSEPORT') && strpos(php_uname('s'), 'BSD') !== false) {
    define('SO_REUSEPORT', 0x200);
}

2015-08-16 17:01 GMT+03:00 Артём Доронин <artemich...@gmail.com>:
как я понимаю, нет констант. Но что мне делать?

--
Message has been deleted

EzheG

unread,
Aug 16, 2015, 11:05:03 AM8/16/15
to phpd...@googlegroups.com
Репа - репозиторий.

16 авг. 2015 г., в 17:51, Артём Доронин <artemich...@gmail.com> написал(а):

воскресенье, 16 августа 2015 г., 17:47:57 UTC+3 пользователь Ефименко Дмитрий написал:
Исправление в репе, пробуйте

оскорблять и я могу. лучше бы просто подсказали. 

Артём Доронин

unread,
Aug 16, 2015, 11:14:10 AM8/16/15
to phpdaemon
да, я уже понял
извините за незнание терминов)

воскресенье, 16 августа 2015 г., 18:05:03 UTC+3 пользователь Ефименко Дмитрий написал:

Артём Доронин

unread,
Aug 16, 2015, 1:08:35 PM8/16/15
to phpdaemon
так что, ни кто мне не скажет в чём может быть проблема? 
просто очень много времени потратил на phpdeamon, уже думал что нибудь другое попробовать. 
но все уж хвалят. хотелось бы его добить уже)

Vasily Zorin

unread,
Aug 16, 2015, 3:04:16 PM8/16/15
to phpd...@googlegroups.com
Нет никакой проблемы. Warning не мешает работоспособности.

--

Vasily Zorin

unread,
Aug 16, 2015, 3:07:05 PM8/16/15
to phpd...@googlegroups.com
Если обновитесь то ошибки не будет, добавил @.

Артём Доронин

unread,
Aug 16, 2015, 4:00:12 PM8/16/15
to phpdaemon
да, ошибок уже нет. вот всё что вывелось

[PHPD] M#2324 \PHPDaemon\Core\Pool:Servers\WebSocket up.
[PHPD] M#2324 PHPDaemon\Servers\WebSocket\Pool: Couldn't set option REUSEPORT to socket (92 - Protocol not available).
[PHPD] M#2324 \PHPDaemon\Core\Pool:\PHPDaemon\Servers\WebSocket\Pool up.
[root@server84 opt]# [PHPD] W#2326 \PHPDaemon\Applications\MyWebSocket up.
[PHPD] Spawning 1 worker(s)
[PHPD] W#2328 \PHPDaemon\Applications\MyWebSocket up.


но всё равно не работает. делаю всё по примеру с хабра

а вот пример на сайте.

Артём Доронин

unread,
Aug 16, 2015, 4:01:26 PM8/16/15
to phpdaemon
не могу толком найти, суть этой ошибки
WebSocket connection to 'ws://goldkinar.ru:8047/myws/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

Артём Доронин

unread,
Aug 16, 2015, 4:14:09 PM8/16/15
to phpdaemon
в логах ничего, кроме подключения демона

Артём Доронин

unread,
Aug 17, 2015, 3:33:46 AM8/17/15
to phpdaemon
у меня такое ощущение, что если бы всё делал с нуля, то потратил бы меньше времени и всё уже работало. но изобретение велосипедов не приветствую.

если ни кто не может помочь в чём проблема. подскажите другой легковесный фреймворк, хотя бы для обычных real-time сообщений.
у меня вообще стоит задача, просто динамически оповещать человека о новых сообщениях, новых заказах, заявок в друзья и т.п. полинг и лонг полинг не подходят.

aleks....@gmail.com

unread,
Aug 17, 2015, 3:37:45 AM8/17/15
to phpd...@googlegroups.com
Почему не подходит лонг поллинг? Это как раз его задача. Смотрите в сторону готовых и полу готовых решений - centrafuge, dklab realplexor хоть бы. 

Отправлено с iPhone

17 авг. 2015, в 10:33, Артём Доронин <artemich...@gmail.com> написал(а):

у меня такое ощущение, что если бы всё делал с нуля, то потратил бы меньше времени и всё уже работало. но изобретение велосипедов не приветствую.

если ни кто не может помочь в чём проблема. подскажите другой легковесный фреймворк, хотя бы для обычных real-time сообщений.
у меня вообще стоит задача, просто динамически оповещать человека о новых сообщениях, новых заказах, заявок в друзья и т.п. полинг и лонг полинг не подходят.

--

Артём Доронин

unread,
Aug 17, 2015, 3:51:53 AM8/17/15
to phpdaemon
я честно сказать, хотел начать именно с dklab realplexor. уже и статей много прочитал. 
но читая комментарии, видел, что люди отдают предпочтение именно phpDeamon. вот и решил забить на него. 
спасибо, сейчас попробую разобраться с dklab

aleks....@gmail.com

unread,
Aug 17, 2015, 3:57:14 AM8/17/15
to phpd...@googlegroups.com
Если хотите, напишите приватом мне почтой, опишите задачу и требования, придумаем решение, я такими проектами занимаюсь уже 5 лет

Отправлено с iPhone

17 авг. 2015, в 10:51, Артём Доронин <artemich...@gmail.com> написал(а):

я честно сказать, хотел начать именно с dklab realplexor. уже и статей много прочитал. 
но читая комментарии, видел, что люди отдают предпочтение именно phpDeamon. вот и решил забить на него. 
спасибо, сейчас попробую разобраться с dklab

--

Vasily Zorin

unread,
Aug 17, 2015, 2:31:34 PM8/17/15
to phpd...@googlegroups.com
SockJS использовали бы, в phpDaemon есть реализация.

Иван Калаушин

unread,
Feb 4, 2017, 12:01:02 PM2/4/17
to phpdaemon
Здравствуйте. 
Получил ошибку (уже не warning, ошибку в логе) о невозможности использовать SO_REUSEPORT (92 ошибка). 
OS CentOS 6.8, ядро было 2.6.32-220.el6.x86_64

Проверочный пример от Василия из этого треда

php -r 'var_dump([php_uname('s'), defined('SO_REUSEPORT') ? SO_REUSEPORT : false]);'


выдавал то же самое, что и у Артема: 
PHP Notice:  Use of undefined constant s - assumed 's' in Command line code on line 1

array
(2) {
 
[0]=>
 
string(5) "Linux"
 
[1]=>

 
bool(false)
}


Т.е. PHPD все еще ошибается с определением возможности использовать SO_REUSEPORT на CentOS 6 со стандартным ядром, которое ставят большинство хостеров на VPS.
Проверял на зафиксированной в нашем проекте версии (выдержка из composer.lock):
        {    
           
"name": "kakserpom/phpdaemon",
           
"version": "dev-master",
           
"source": {
               
"type": "git",
               
"url": "https://github.com/kakserpom/phpdaemon.git",
               
"reference": "029d323417682789f8c8471b6f77154f2a38e450"
           
},
           
"dist": {
               
"type": "zip",
               
"url": "https://api.github.com/repos/kakserpom/phpdaemon/zipball/029d323417682789f8c8471b6f77154f2a38e450",
               
"reference": "029d323417682789f8c8471b6f77154f2a38e450",
               
"shasum": ""
           
},

И на последней версии PHPD из репозитория https://github.com/kakserpom/phpdaemon.git 

Результат немного отличался, но PHPD стабильно не открывал порт (проверено через "netstat -plunt")

Нагуглил проблему - неполная/неверная реализация SO_REUSEPORT в "старых" ядрах линукс. 

Обновил ядро до 
bash-4.1# uname -r
2.6.32-642.13.1.el6.x86_64

Проблема для меня решена. 
Здесь написал для того, чтобы кто-то в поиске решения мог обнаружить рецепт.
И может быть для того, чтобы Василий и другие разработчики PHPD смогли доработать проверку для более полной поддержки ОС подсемейства CentOS

Безусловно, нужно и правильно работать с максимально актуальными версиями ядра и остального ПО
Однако, ядра веток 2.x, 3,x, 4.x используются в разных дистрибутивах *nix, и наверняка еще не один человек может столкнуться с подобной проблемой.



воскресенье, 16 августа 2015 г., 19:45:07 UTC+6 пользователь Артём Доронин написал:
Reply all
Reply to author
Forward
0 new messages