У меня есть интересная проблема, с которой я не могу добраться до дна.прерывание петли foreach перед достижением конца петли
Мой код выглядит следующим образом:
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);
}
Это используется для отслеживания событий на Google Analytics. Событие всегда состоит из трех разных строк заголовков, которые мне нужно записать в сокет.
Я тестировал 2 события, что означает, что $this->_queue
содержит 6 строк.
Каждый раз, когда я просматриваю код, я когда-либо достигаю индекса [2]
(Третий элемент), а затем конец цикла, линия socket_close($this->_socket);
никогда не достигалась.
Я пробовал найти решения here и here без успеха, я установил размер буфера на 100000 и включил usleep (5), а также соответствующие символы возврата каретки.
Есть ли какая-либо другая причина, по которой мой код может покинуть foreach до его завершения?
Есть ли другой, лучше Способ для этого?
Любая информация в консоли браузера? Разве сокет не ждет вас, чтобы прочитать ответ betwen пишет? –
@SergioBernardo 'socket_write' просто возвращает целое число, которое сообщит мне, сколько байтов было написано, или' false', если произошла ошибка. Я отлаживался с помощью xdebug, и он каждый раз записывался успешно, я также ничего не нашел в руководстве по PHP или в другом месте, что означало бы, что он ждал чего-либо, что нужно прочитать. Это работает для первых 3 отдельных элементов в очереди, а затем выходит из не только цикла, но и после третьего элемента. – Skytiger
В таком случае я бы заменил foreach (...) на что-то вроде: for ($ i = 0; $ i _ queue); $ i ++) {$ header = $ this -> _ queue [$ я]; ... Затем поместите печать («loop $ i - где-то \ n») в определенных местах, чтобы увидеть, где она остановится ... –