我有一个有趣的问题,我无法深入了解。
我的代码如下:
public function __destruct()
{
foreach ($this->_queue as $index => $header) {
$result = socket_write($this->_socket, $header);
if (!$result)
{
$s_err = socket_last_error($this->_socket);
$str_err = socket_strerror($s_err);
}
}
socket_close($this->_socket);
}
这用于跟踪谷歌分析上的事件。一个事件总是由3个不同的头字符串组成,我需要将它们写入套接字。
我已经用2个事件进行了测试,这意味着$this->_queue
包含6个字符串。
然而,每次我运行代码时,我只到达索引[2]
(第三项),然后循环结束,socket_close($this->_socket);
行永远不会到达。
我已经尝试过这里和这里的解决方案,但没有成功,我将缓冲区大小设置为100000,并包含usleep(5)以及适当的回车字符。
我的代码可能在foreach完成之前退出,还有其他原因吗?
还有其他更好的方法吗?
首先,我注意到在for循环存在后套接字关闭,要做到这一点,循环中的所有操作都必须完成。其次,问题可能与项[2]的结果有关,该项保持函数挂起,因为:
if(!$result){
$s_err=socket_last_error($this->_socket)
$str_err=socket_strerror($s_err)
}
可能不会返回捕获的错误。。检查正在调用的两个错误函数。因此,socket_last_error($this->_socket)和socket_strerror($s_err)。
在if块中使用"continue"可以跳过可能导致问题的任何错误。。。因此:
if(!$result){
继续
}
这将跳过任何错误并继续循环中的下一项
如果这样做有效,那么问题肯定是两个错误函数被称为
嗯。。。6个字符串,并且您一次检索2个字符串($index
和$header
)如果$index
的值从零开始编号,并且您看到的最后一个值是两个,则循环已运行(0..1.2)=3次,这正是正确的数字:2*3=6。
但是,一般来说,调试这些东西最简单的方法是临时添加一两个print
语句,这样您就可以查看发生了什么
对于PHP,您必须始终检查日志中的"警告",因为该语言在应该停止的情况下以"继续运行"而臭名昭著。