Esta es la solución más correcta que te podemos compartir, sin embargo estúdiala pausadamente y valora si es compatible a tu proyecto.
Solución:
Busqué esto bastante y finalmente encontré una solución relativamente simple.
Esto no requiere ninguna biblioteca PHP adicional, solo usa sockets.
En lugar de intentar conectarse a la interfaz websocket como tantas otras soluciones, simplemente conéctese al servidor node.js y use .on('data')
para recibir el mensaje.
Después, socket.io
puede reenviarlo a los clientes.
Detecta una conexión desde tu servidor PHP en Node.js así:
//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.on("connection", function(s)
//If connection is from our server (localhost)
if(s.remoteAddress == "::ffff:127.0.0.1")
s.on('data', function(buf)
var js = JSON.parse(buf);
io.emit(js.msg,js.data); //Send the msg to socket.io clients
);
);
Aquí está el código php increíblemente simple: lo envolví en una función, es posible que se le ocurra algo mejor.
Tenga en cuenta que 8080
es el puerto a mi servidor Node.js; es posible que desee cambiar.
function sio_message($message, $data)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, '127.0.0.1', 8080);
if(!$result)
die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
$bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
socket_close($socket);
Puedes usarlo así:
sio_message("chat message","Hello from PHP!");
También puede enviar matrices que se convierten a json y se transmiten a los clientes.
sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));
Esta es una forma útil de “confiar” en que sus clientes están recibiendo mensajes legítimos del servidor.
También puede hacer que PHP transmita actualizaciones de la base de datos sin que cientos de clientes consulten la base de datos.
Desearía haber encontrado esto antes, ¡espero que esto ayude!
Edición tardía: No estoy seguro si esto es un requisito, pero agregué esto a mi http.conf (configuración de Apache):
Pensé que pondría el código aquí en caso de que ayude a alguien.
En httpd.conf agregué el siguiente código:
RewriteEngine On
RewriteCond %HTTP:UPGRADE ^WebSocket$ [NC]
RewriteCond %HTTP:CONNECTION Upgrade$ [NC]
RewriteRule .* ws://localhost:8080%REQUEST_URI [P]
ProxyRequests Off
ProxyPass /socket.io http://localhost:8080/socket.io retry=0
ProxyPassReverse /socket.io http://localhost:8080/socket.io retry=0
ProxyPass "/node" "http://localhost:8080/"
estoy usando http://elephant.io/ para la comunicación entre php y socket.io, solo tengo problemas con el tiempo para establecer la conexión, 3 o 4 segundos para completar el envío de datos.
init();
$elephant->emit('message', 'foo');
$elephant->close();
Con la última versión de ElephantIO
He logrado enviar un mensaje con:
include_once("vendor/autoload.php");
use ElephantIOExceptionServerConnectionFailureException;
$client = new ElephantIOClient(new ElephantIOEngineSocketIOVersion1X('http://localhost:9000'));
try
$client->initialize();
$client->emit('message', ['title' => 'test']);
$client->close();
catch (ServerConnectionFailureException $e)
echo 'Server Connection Failure!!';
Si piensas que ha sido provechoso nuestro post, sería de mucha ayuda si lo compartieras con más programadores y nos ayudes a extender nuestro contenido.