下面是一个示例HTTP 1.1调用,请求单个页面:
GET /jq.js HTTP/1.1
Host: 127.0.0.1
Accept: */*
Run Code Online (Sandbox Code Playgroud)
我理解使用HTTP Pipelining,可以在不中断连接的情况下发送多个请求.
问题结束时的解决方案
我正在编写一个PHP应用程序,它将消息发送到服务器,然后在使用时读回响应stream_get_contents.我以相同的方式在Android应用程序中与同一服务器通信.Android应用程序工作正常并快速响应,但是当从服务器读回响应时PHP挂起.
在下面的代码示例中,我设置了一个5字节的微小缓冲区大小来测试理论.如果我删除它的缓冲区大小,它会挂起,但是在5字节大小的情况下,它只会在最后一次循环中挂起:
stream_set_timeout($this->socket, 10); //10 seconds read timeout
while (!feof($this->socket)) {
$breakOut = false;
echo 'Reading response'.time().'<br/>';
$data = stream_get_contents($this->socket, 5);
echo 'Read response'.time().'<br/>';
if ($data === false) {
$this->latestErrStr = "Timed out waiting for a response.";
return false;
} else {
$index = strpos($data, chr(3));
if ($index !== FALSE){
$breakOut = true;
$data = substr($data, 0, $index);
}
$response .= $data;
}
$stream_meta_data = stream_get_meta_data($this->socket);
//If we have no EOF marker then break if there are …Run Code Online (Sandbox Code Playgroud) 我有一个自制的PHP TCP聊天服务器,但是它没有检测远程断开连接的方法。
如果有人知道一种方法来获取stream_socket_server()并吐出与之连接的所有内容,我将不胜感激。
然后,您可以在psuedocode中运行这样的循环:
$main_socket=stream_socket_server("tcp://",....)
//Do Something.... say, wait for a connection (with stream_socket_accept())?
for (each CONNECTION in $main_socket)
{
//Do something with or to that connection
}
//Loop back... if you need to say, wait for another connection
Run Code Online (Sandbox Code Playgroud)
或者,我可以检查当前是否连接了使用$ stream_socket_accept()创建的变量。
在我弄清楚这个项目之前,这个项目是失败的。我将感谢任何可以帮助我解决这一问题的人!
这是一个关于如何处理从网络套接字接收到的前缀消息的后续问题。我尝试做的是:
到目前为止,我有以下两行代码:
$prefix = socket_read($socket, 4, PHP_BINARY_READ); //No 1.
//No 2: how to do the checks?
$message = socket_read($socket, $prefix, PHP_BINARY_READ); //No 3.
//No 4: how to do the checks?
Run Code Online (Sandbox Code Playgroud)
我该如何进行上述检查?
小提示:所有通过网络套接字连接发送的数据都是UTF8,little-endian
我正在开发 Laravel 5.8,并且有一个按钮可以启动数据库中的队列作业,立即发送数千封电子邮件。
我想使用状态或进度栏实时监控前端队列的进度。我正在考虑使用Pusher、WebSocket或Laravel Echo,但我对选择哪个解决方案感到困惑,因为它也涉及数据库表。
我想使用PHP套接字通过网络连接将JSON消息从PHP脚本发送到C#应用程序.
通常,对于二进制协议,每条消息的前4个字节必须是一个整数,表示消息的长度(多少字节).
在C#中,我为每条消息添加一个整数,该整数表示消息的长度,如下所示:
byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);
Run Code Online (Sandbox Code Playgroud)
据我所知,在PHP中,函数socket_send只接受字符串.那么,我怎么能在PHP 5.x中做同样的前缀呢?
更新:我发布了一个关于如何从网络套接字接收此类前缀数据的后续问题.
我正在尝试用PHP开发代码判断软件以进行编程分配.我会尝试在需要套接字编程的java服务器上编译代码.我对PHP中的套接字编程有一些了解.我用谷歌搜索,发现一个代码做了一些类似的工作.但我仍然无法获得事情的要点.它实际上是否有效?手册太技术化,无法获得良好的理解
这是一段代码,根据我的理解,我写了评论:
$socket = fsockopen($compilerhost, $compilerport); // creates connection it returns the file pointer
if($socket) { // if it returns a file pointer
fwrite($socket, $_POST['filename']."\n"); //write the filename in the file pointer returned by socket and chagne line
$query = "SELECT time, input, output FROM problems WHERE sl='".$_POST['id']."'"; // select input,output,for the problem
$result = mysql_query($query);
$fields = mysql_fetch_array($result);
fwrite($socket, $fields['time']."\n"); // write the time in the file pointer returned
Run Code Online (Sandbox Code Playgroud)
我不明白fsockopen是如何工作的?如何在这里使用fwrite?
注意:虽然通过代码我无处找到$ compilerhost,$ compilerport变量.
纠正我的疑虑.谢谢提前和原谅英语不好
我在后端运行Ratchet WebSocketServer,一切正常。
<?php
require '../vendor/autoload.php';
use Ratchet\WebSocket\WsServer;
use Ratchet\Http\HttpServer;
$wsServer = new WsServer(new Chat());
$wsServer->disableVersion(0);
$server = \Ratchet\Server\IoServer::factory(
new HttpServer(
$wsServer
),
8080
);
$server->run();
Run Code Online (Sandbox Code Playgroud)
但是我想使用简单的php脚本连接到websocket,以将消息发送到服务器。
$host = 'ws://localhost'; //where is the websocket server
$port = 8080;
$local = "http://example.com"; //url where this script run
$data = "first message"; //data to be send
$head = "GET / HTTP/1.1"."\r\n".
"Upgrade: WebSocket"."\r\n".
"Connection: Upgrade"."\r\n".
"Origin: $local"."\r\n".
"Host: $host:$port"."\r\n".
"Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
"Content-Length: ".strlen($data)."\r\n"."\r\n";
//WebSocket handshake
$sock = fsockopen($host, $port);
fwrite($sock, $head ) or …Run Code Online (Sandbox Code Playgroud) 这让我疯了.我必须在php 5.3中创建一个非常简单的非阻塞套接字脚本,其中客户端连接到服务器,都使用非阻塞套接字.
我已经尝试过phpsocketdaemon和php手册中的示例,但在这两种情况下,当我尝试连接到服务器时,我收到以下错误:
socket_connect() [function.socket-connect]: unable to connect [10035]:
A non-blocking socket operation could not be completed immediately
Run Code Online (Sandbox Code Playgroud)
发生错误的客户端脚本:
$service_port = 2002;
$address = '127.0.0.1';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
$result = socket_connect($socket, $address, $service_port);
...
Run Code Online (Sandbox Code Playgroud)
我在Win 7上使用Zend Server 5.6.0 SP1的免费版本.
有谁知道如何解决这个问题或知道一个简单易懂的非阻塞套接字客户端/服务器脚本的例子?
我试图以非阻塞方式向流中写入大量数据(~250K).
抽象出复杂性和对象结构,这就是我正在运行的:
$fp = fsockopen('host', 80);
socket_set_blocking( $fp, false );
fwrite( $fp, $string, $length ); // Where $string is a 250K string
Run Code Online (Sandbox Code Playgroud)
但是,数据并非都写入.假设这是PHP的写缓冲区,我设置stream_set_write_buffer( $fp, 0 )但是也没有解决问题.
我把我的fwrite打成了4096B的块 - 看起来客户端发送了3个完整的批次(4096字节)和第四批的~1500B.对fwrite的任何和所有连续调用都返回0字节写入.
有没有人知道如何将这些数据排队以非阻塞的方式发送出去?如果我删除socket_set_blocking( $fp, false );- 一切正常.很明显,这是异步运行它的问题.
你的想法是什么?套接字扩展是否会对此有所帮助?它以不同方式处理缓冲区吗
注意:我故意编写此套接字传输层以避免因各种原因使用curl.使用curl_multi()不是一种选择.
php-socket ×10
php ×8
sockets ×8
apache ×1
fsockopen ×1
http-1.1 ×1
http-request ×1
laravel ×1
laravel-5.8 ×1
php-5.3 ×1
prefix ×1
ratchet ×1
real-time ×1
stream ×1
websocket ×1