У меня есть Socket.io на основе Websocket-Server, который должен получать уведомления из приложения php. я нашел http://elephant.io/ которая кажется подходящей библиотекой для этого. Похоже, что elephant.io оптимизирован для композиторов, потому что я не могу найти ни одного примера для его использования без них, и, попробовав его самостоятельно, я получаю бесконечные ошибки включаемых файлов, которые отсутствуют.
Поэтому я впервые установил composer и пакет elephant.io в папку lib \ composer, чтобы все файлы этой библиотеки находились в lib \ composer \ vendor \ wisembly. Пример из http://elephant.io/#usage не работает, потому что конструктор клиента не принимает эти параметры. У него только два аргумента, и первый должен быть экземпляром ElephantIO \ EngineInterface, поэтому я попробовал следующее:
error_reporting(E_ALL);
ini_set('display_errors', true);
require_once __DIR__ . '/lib/composer/vendor/autoload.php';
use ElephantIO\Client as Elephant;
use ElephantIO\Engine\SocketIO as Version1X;
$elephant = new Elephant(new Version1X('http://mywsserver.com:8000'));
$elephant->init();
$elephant->send(
ElephantIOClient::TYPE_EVENT,
null,
null,
json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();
echo 'tryin to send `bar` to the event `foo`';
Но это также не работает:
Fatal error: Class 'ElephantIO\Engine\SocketIO' not found in C:\inetpub\wwwroot\test.php on line 11
Я новичок в композиторе, но для меня кажется, что эта система должна обрабатывать все включающие вещи, включая файл автозагрузки.
Я просто хочу отправлять уведомления из php-приложения на сервер socket.io, кажется, это очень сложно сделать. Единственная альтернатива, которую я нашел, https://github.com/rase-/socket.io-php-emitter но этот требовал редиса. Мне бы это не понравилось, потому что я пользуюсь Windows, и мое приложение не получит выгоды от повторного использования, потому что у меня только один сервер.
Разве нет простого способа сделать это? Я использовал phpws до того, как я использовал socket.io, это работало отлично, но socket.io кажется лучшим решением вместо библиотеки .NET, которую я использовал в качестве сервера ранее, поэтому я бы предпочел сохранить socket.io.
Я использовал ElephantIO раньше, и я создал собственный автозагрузчик php. Композитор должен был это сделать, но не мог понять, где вы ошиблись в коде. Во всяком случае это был мой autoloader.php
require_once("src/Client.php");
require_once("src/EngineInterface.php");
require_once("src/AbstractPayload.php");
require_once("src/Exception/SocketException.php");
require_once("src/Exception/MalformedUrlException.php");
require_once("src/Exception/ServerConnectionFailureException.php");
require_once("src/Exception/UnsupportedActionException.php");
require_once("src/Exception/UnsupportedTransportException.php");
require_once("src/Engine/AbstractSocketIO.php");
require_once("src/Engine/SocketIO/Session.php");
require_once("src/Engine/SocketIO/Version0X.php");
require_once("src/Engine/SocketIO/Version1X.php");
require_once("src/Payload/Decoder.php");
require_once("src/Payload/Encoder.php");
Я исправил это с помощью:
use ElephantIO\Engine\SocketIO\Version1X as Version1X;
вместо:
use ElephantIO\Engine\SocketIO as Version1X;
а потом:
$Elephant = new Elephant(new Version1X("http://localhost:8000"));
var_dump($Elephant);
результат:
объект (ElephantIO \ Client) # 8 (2) {
[ «Двигатель»: «ElephantIO \ Client»: частный] =>
объект (ElephantIO \ Engine \ SocketIO \ Version1X) # 9 (4) {
[«url»: protected] => array (6) {[«схема»] => string (4) «http» [«host»] => string (9) «localhost» [«query»] => массив (0) {} [«путь»] =>
string (9) «socket.io» [«port»] => int (8000) [«secure»] => bool (false)}
[«сеанс»: защищен] => NULL [«параметры»: защищен] => массив (7) {
[«context»] => array (0) {} [«debug»] => bool (false) [«wait»] =>
int (100000) [«timeout»] => string (2) «60» [«version»] => int (2)
[«use_b64»] => bool (false) [«transport»] => string (7) «polling»}
[«stream»: protected] => NULL} [«logger»: «ElephantIO \ Client»: private] =>
НОЛЬ }
Вам нужно немного пересмотреть свою концепцию пространств имен PHP, так как MfaspkОтвет подсказал это.
У нас не может быть автозагрузчика в пакете, так как это библиотека, а не приложение само по себе; он будет включен в другие библиотеки. Таким образом, автозагрузчик в вашем собственном приложении должен заботиться об автозагрузке, а не о библиотеке (в противном случае, если каждая библиотека должна будет зарегистрировать свою собственную систему автозагрузки, это будет своего рода бесполезный беспорядок)
Кстати, документ на сайте не обновлен (мы должны позаботиться об этом с небольшим количеством времени …). Поскольку README упоминает об этом, есть простой пример, показывающий основные инструкции: https://github.com/Wisembly/elephant.io/tree/master/example/socket.io/1.x/emitter
Извините за задержку, я не проверяю достаточно часто переполнение стека, особенно по теме Elephant.io 🙂