Работа с сокетами, не ишутся данные при определенном размере чанков

delta_beta

Новичок
Нужно передать сообщение через сокет. Сообщение большое и поэтому разбивается на куски. Вопрос вот в чем. Если передается 125 кусков сообщения, то оно записывается нормально, а если 131, то уже не пишется, хотя сокет никакой ошибки не выдает и возвращает успешный результат.
Вот часть кода:
PHP:
$messageId = $this->getMessageId();

// Split the message into chunks
$messageChunks = $this->getMessageChunks($preparedMessage);
$messageChunksCount = count($messageChunks);

// Send chunks to graylog server
foreach(array_values($messageChunks) as $messageChunkIndex => $messageChunk) {
$bytesWritten = $this->writeMessageChunkToSocket(
$socket,
$messageId,
$messageChunk,
$messageChunkIndex,
$messageChunksCount
);

if(false === $bytesWritten) {
// Abort due to write error
return false;
}
}

где
PHP:
protected function writeMessageChunkToSocket($socket, $messageId, $messageChunk, $messageChunkIndex, $messageChunksCount) {
return @fwrite(
$socket,
$this->prependChunkInformation($messageId, $messageChunk, $messageChunkIndex, $messageChunksCount)
);
}

и

PHP:
protected function prependChunkInformation($messageId, $data, $sequence, $sequenceSize) {
if(!is_string($data) || $data === '') {
throw new \InvalidArgumentException('Data must be a string and not be empty.');
}

if(!is_integer($sequence) || !is_integer($sequenceSize)) {
throw new \InvalidArgumentException('Sequence number and size must be integer.');
}

if($sequenceSize <= 0) {
throw new \InvalidArgumentException('Sequence size must be greater than 0.');
}

if($sequence > $sequenceSize) {
throw new \InvalidArgumentException('Sequence size must be greater than sequence number.');
}

return pack('CC', 30, 15) . substr(md5($messageId, true), 0, 8) . pack('CC', $sequence, $sequenceSize) . $data;
}

подскажите пожалуйста в чем может быть проблема.
 

accido

Новичок
Не вижу связи. можете подробнее объяснить пожалуйста?
ну, это лишь догадки. В PHP, скажем так, много не документированного поведения. Может там буфер на 128 чанков и первая порция уходит, а следующая страница буфера не сбрасывается.
http://ua2.php.net/flush
или, если у вас тестовый сервер, то можно отключить в настройках
http://www.php.net/manual/en/outcontrol.configuration.php
 

fixxxer

К.О.
Партнер клуба
accido, не неси чушь, буферизация вывода не имеет никакого отношения к работе с сокетами.

delta_beta, а почему ты решил, что не пишется? Может, ты неправильно читаешь? При чтении из сокета никто не гарантирует, что будет прочитано length символов - это просто максимальный лимит, а возвращается значение как только хоть что-то прилетело, нужно читать в цикле. Ну и tcpdump в руки, разумеется. И еще я бы сразу убедился что не включен mbstring overload.
 
Последнее редактирование:

accido

Новичок
accido, не неси чушь, буферизация вывода не имеет никакого отношения к работе с сокетами.
К сокетам может и не имеет, а вот к похапешной
fsockopen как раз таки имеет. Вообще, сложно что-то бывает понять в похапе, пока сам не столкнешься.
 
Последнее редактирование:

HraKK

Мудак
Команда форума
Ну, слово ты, допустим, запретишь. А всю армию пишуших на похапе куда девать?
К Попову на курсы. Или же как мы в Варгейминге делали в пайтон отдел сплавляли)
 

AmdY

Пью пиво
Команда форума
К Попову на курсы. Или же как мы в Варгейминге делали в пайтон отдел сплавляли)
откуда дровишки про варгейминг? моему другу эйчары так мозг промыли, что он зажёгся и изменил php, подался в java проектировать платёжные системы.
 

delta_beta

Новичок
Спасибо всем! на сервере оказалось установлено дефолтное значение, которое принимает 128 чанков и больше он просто не тянет.
 
Сверху