Поставил последний PHP без suhosin.
Раньше при segfault в daemon.log писалось "killed by SEGV signal".
Теперь про segmentation fault больше ничего не вижу. Возможно, даже падения стали реже.
Но падает так же без ошибок PHP, а в daemon.log пишет "terminated with status 65".
Нашёл что 65 - это EX_DATAERR /* data format error */
Логгированием обнаружил, что чаще всего падает при обработке сообщений определённого типа.
Получает вот такой XML:
PHP:
<Odds active="1" changed="true" combination="0" freetext="Correct score flex" id="1806497" specialoddsvalue="4:0" subtype="104" type="ftnw"
typeid="8">
<OddsField active="1" type="4:0">2.4</OddsField>
<OddsField active="1" type="5:0">2.85</OddsField>
<OddsField active="1" type="6:0">9.5</OddsField>
<OddsField active="1" type="7:0">64.0</OddsField>
<OddsField active="1" type="8:0">75.0</OddsField>
<OddsField active="1" type="9:0">75.0</OddsField>
<OddsField active="1" type="10:0">75.0</OddsField>
<OddsField active="1" type="4:1">10.25</OddsField>
<OddsField active="1" type="5:1">21.0</OddsField>
<OddsField active="1" type="6:1">53.0</OddsField>
<OddsField active="1" type="7:1">75.0</OddsField>
<OddsField active="1" type="8:1">75.0</OddsField>
<OddsField active="1" type="9:1">75.0</OddsField>
<OddsField active="1" type="4:2">75.0</OddsField>
<OddsField active="1" type="5:2">75.0</OddsField>
<OddsField active="1" type="6:2">75.0</OddsField>
<OddsField active="1" type="7:2">75.0</OddsField>
<OddsField active="1" type="8:2">75.0</OddsField>
<OddsField active="1" type="4:3">75.0</OddsField>
<OddsField active="1" type="5:3">75.0</OddsField>
<OddsField active="1" type="6:3">75.0</OddsField>
<OddsField active="1" type="7:3">75.0</OddsField>
<OddsField active="1" type="4:4">75.0</OddsField>
<OddsField active="1" type="5:4">75.0</OddsField>
<OddsField active="1" type="6:4">75.0</OddsField>
<OddsField active="1" type="4:5">75.0</OddsField>
<OddsField active="1" type="5:5">75.0</OddsField>
<OddsField active="1" type="4:6">75.0</OddsField>
</Odds>
и парсит его с помощью SimpleXml (все XML заведомо маленького объёма)
падает где-то на этом участке кода:
прошу прощения, точнее не смог написать, потому что даже для определения этого участка пришлось глазами "пропарсить" 200 мб логов.
из кода вырезал всё лишнее.
PHP:
$xml = simplexml_load_string($xml);
foreach ($xml->Odds as $odds) {
$odds_id = (string)$odds['id'];
if (!isset($this->odds["$event_id"]))
$this->odds["$event_id"] = array();
if (!isset($this->odds["$event_id"]["$odds_id"]))
$this->odds["$event_id"]["$odds_id"] = array();
$cur_odds = $this->odds["$event_id"]["$odds_id"];
if (isset($odds['specialoddsvalue'])) {
$special = (string)$odds['specialoddsvalue'];
} else
$special = '';
/*
Падает где-то в этом цикле, обарботав несколько OddsField.
Падает изредка, системы не заметил.
*/
foreach ($odds->OddsField as $odd) {
$odd_type = (string)$odd['type'];
if (!isset($cur_odds["$odd_type"])) {
## пробуем найти ее в базе
$q = OddTable::getInstance()->createQuery('o')
->where('o.event_id = ?', $event_id)
->andWhere('o.type = ?', $NL_type_id)
->andWhere('o.outcome = ?', $odd_type);
if ($special !== '')
$q->andWhere('o.special = ?', $special);
if (!$sth = $q->fetchOne()) {
$cur_odds["$odd_type"] = new Odd();
$cur_odds["$odd_type"]->setEventId($event_id);
$cur_odds["$odd_type"]->setType($NL_type_id);
$cur_odds["$odd_type"]->setOutcome($odd_type);
$cur_odds["$odd_type"]->setSpecial($special);
} else {
$cur_odds["$odd_type"] = $sth;
}
} else {
$cur_odds["$odd_type"]->setOutcome($odd_type);
$cur_odds["$odd_type"]->setSpecial($special);
}
if (((int)$odds['active']) && ((int)$odd['active'])) {
$cur_odds["$odd_type"]->setValue((float)$odd);
$cur_odds["$odd_type"]->setIsActive(1);
} else {
$cur_odds["$odd_type"]->setIsActive(0);
}
try {
$cur_odds["$odd_type"]->save();
} catch (Exception $e) {
echo $e->getTraceAsString();
throw $e;
}
$this->odds["$event_id"]["$odds_id"] = $cur_odds;
}
}
Комменты к коду:
Конструкции типа $odds["$event_id"]["{$odds['id']}"] с ключами в кавычках использую специально, потому что иначе PHP пытается делать интовые ключи, а это не всегда приводит к хорошим последствиям с этими данными.