foreach循环在到达循环结束之前中断


foreach loop breaking before reaching end of loop

我有一个有趣的问题,我无法深入了解。

我的代码如下:

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,您必须始终检查日志中的"警告",因为该语言在应该停止的情况下以"继续运行"而臭名昭著。