Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP socket\u read/recv阻止python的socket.send_Php_Python_Sockets_Send_Recv - Fatal编程技术网

PHP socket\u read/recv阻止python的socket.send

PHP socket\u read/recv阻止python的socket.send,php,python,sockets,send,recv,Php,Python,Sockets,Send,Recv,我正在Linux上用Python和JS+PHP客户端构建Firebird DB事务管理器。Javascript向PHP发送所有必要的信息;PHP对此进行编码,并通过套接字将其发送到Python,Python将套接字绑定到一个端口,不断侦听,并使用线程创建一个新线程来异步处理该请求 python中的accept循环: while 1: conn, addr = s.accept() req = conn.recv(1024) ret = read_headers(req)

我正在Linux上用Python和JS+PHP客户端构建Firebird DB事务管理器。Javascript向PHP发送所有必要的信息;PHP对此进行编码,并通过套接字将其发送到Python,Python将套接字绑定到一个端口,不断侦听,并使用线程创建一个新线程来异步处理该请求

python中的accept循环:

while 1:
    conn, addr = s.accept()

    req = conn.recv(1024)
    ret = read_headers(req)

    threading.Thread(target=client_thread, args=(conn, addr, ret, smphr,)).start()
s.close()
php中的发送/读取块:

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$sockconnect = socket_connect($sock, $host, $port);
$msg = urldecode(http_build_query($params));
socket_write($sock, $msg, strlen($msg));
$received;
while(socket_recv($sock, $buf, 1024, 0) >= 1){
    $received .= $buf;
}
echo $received;
socket_close($sock);
在我们开始使用更多连接进行测试之前,这一切似乎都正常工作。我在JS客户机中有一个循环,它发送几个25-100是我到目前为止使用的数字查询请求,并从一个大表中选择第一个随机数行

服务器接收到的前几个请求是同时处理的,但随后它似乎变成了同步的

在多次记录之后,我们发现在任何给定的时间只有7/8线程处于活动状态。新的请求只有在当前7个请求中的一个完成后才被接受和处理

如果我在php中注释socket_recv while循环,python将同时运行所有内容并在可用时立即返回,这正是我想要的,但是由于我已经注释了实际得到结果的块,因此没有显示任何明显的内容

根据chrome的网络开发工具,每个请求/查询都被记录为不同的脚本调用,所以我不知道它们为什么会相互阻塞

我对php/python相当陌生,我一辈子都搞不清楚到底发生了什么

有什么建议吗

编辑: 我还尝试了不同的代码位来读取php中的响应—没有一个按预期工作:

$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_WAITALL);
echo $buf;
与以前的实现相同,7/8线程“限制”

$buf = 'buffer';
socket_recv($sock, $buf, 1024, MSG_DONTWAIT);
echo $buf;
正如标志所暗示的,不等待响应,因此没有响应

while ($out = socket_read($sock, 1024, PHP_NORMAL_READ)) {
    echo $out;
}
相同的线程7/8线程限制

第二次编辑:

添加了Python打印,以防有所帮助

使用php读取:

没有php读取:


如果没有php中的read,查询似乎会同时启动,并在准备好后立即返回。

结果表明这是一个浏览器问题。Chrome或者其他现代浏览器最多只能同时支持6个ajax调用


因为我有7个线程“cap”,其中一个是主线程。这条线排得很好

无法确定这是否相关,但是:s.listen的backlog参数是什么?@GilHamilton s.listen设置为100I将在python子线程signal.pause或time.sleepa\u large\u number中设置一个大而胖的sleep。然后发送,比如说,25或50个请求。然后尝试找出这些线程/连接处于什么状态。因为此时应该有25-50个不同的线程,所以可能会知道发生了什么。您没有说是什么平台,但至少在linux上,您可以使用strace-o/tmp/xxx-ff python启动python。。。让strace显示所有系统调用。python脚本在linuxK上运行。所以我会用signal.pause。使用strace命令,在启动所有请求(假设有25个请求)后,您应该有26个线程,因此有26个名为/tmp/xxx.NNN的文件。查看每个文件中的最后几行。其中一个主服务器线程在接受系统调用时应该挂起,其他线程都应该在暂停时挂起。如果没有,你可以看到他们被困在哪里。如果所有25个都暂停了,那么可能会有更微妙的事情发生。
starting select first 3000 * from receb_quotas on tr1
starting select first 1 * from receb_quotas on tr0
starting select first 1 * from receb_quotas on tr2
starting select first 1 * from receb_quotas on tr4
starting select first 3000 * from receb_quotas on tr3
starting select first 3000 * from receb_quotas on tr5
finishing tr4 (count: 1) | remaining threads: 7
finishing tr0 (count: 1) | remaining threads: 7
starting select first 150 * from receb_quotas on tr8
starting select first 3000 * from receb_quotas on tr6
finishing tr2 (count: 1) | remaining threads: 7
starting select first 1 * from receb_quotas on tr7
finishing tr7 (count: 1) | remaining threads: 7
starting select first 3000 * from receb_quotas on tr9
finishing tr8 (count: 150) | remaining threads: 7
finishing tr1 (count: 3000) | remaining threads: 6
finishing tr3 (count: 3000) | remaining threads: 5
finishing tr6 (count: 3000) | remaining threads: 4
finishing tr5 (count: 3000) | remaining threads: 3
finishing tr9 (count: 3000) | remaining threads: 2
starting select first 3000 * from receb_quotas on tr1
starting select first 15 * from receb_quotas on tr0
starting select first 15 * from receb_quotas on tr3
starting select first 3000 * from receb_quotas on tr4
starting select first 1500 * from receb_quotas on tr2
starting select first 150 * from receb_quotas on tr5
starting select first 1 * from receb_quotas on tr6
starting select first 1500 * from receb_quotas on tr7
starting select first 150 * from receb_quotas on tr8
starting select first 15 * from receb_quotas on tr9
finishing tr0 (count: 15) | remaining threads: 11
finishing tr3 (count: 15) | remaining threads: 10
finishing tr6 (count: 1) | remaining threads: 9
finishing tr9 (count: 15) | remaining threads: 8
finishing tr8 (count: 150) | remaining threads: 7
finishing tr5 (count: 150) | remaining threads: 6
finishing tr7 (count: 1500) | remaining threads: 5
finishing tr2 (count: 1500) | remaining threads: 4
finishing tr1 (count: 3000) | remaining threads: 3
finishing tr4 (count: 3000) | remaining threads: 2