wp_insert_post вызывает Fatal Error

[Удален]
977

wp_insert_post вызывает Fatal error</b>: Allowed memory size of 67108864 bytes exhausted. В чем может быть проблема?

!
На сайте с 29.11.2007
Offline
109
#1

В теме ниже была подобная ошибка. Посмотрите: /ru/forum/470325

.
[Удален]
#2
!bogus:
В теме ниже была подобная ошибка. Посмотрите: /ru/forum/470325

Нет это не то. Сейчас подробнее опишу:

значит есть плагин для вордпресса, в общих словах - плагин пасрер, парсит целые сайты. За счет этого (если сайт большой) со временем накапливается значительный объем информации об уже обработанных и еще не обработанных страницах. Для запуска php-парсера из админки плагина используется аякс. Между клиентским скриптом и аякс приложением регулярно передаются данные (в частности об обработанных и необработанных страницах).

Сначала проблема была в том, что когда данные становились слишком большими, то аякс их терял (ведь есть максимальный допустимый предел передачи методом POST данных). Потом я ввел возможность сохранения надмерной порции промежуточных данных в файл И эта проблема отпала. Но начал вылазить другой баг:

В плагине используется функция wp_insert_post для вставки нового поста. Собственно говоря она вызывается после обработки каждой страницы парсенного сайта (точнее почти каждой, но это сейчас не суть). Так вот wp_insert_post на свой N-ый вызов теперь вызывает фатальную ошибку:

Fatal error: Allowed memory size of 73400320 bytes exhausted (tried to allocate 1966080 bytes) in

/home2/…/wp-db.php on line 589

причем, если wp_insert_post не вызывается (то есть я его просто закоментировал), то ничего не происходит, и обработка продолжается

Теперь еще один важный момент: я попытался запустить старую версию плагина (которая была работоспособной несколько дней назад) и она вызвала ту же ошибку.

Теперь в связи с этим еще такой момент: сегодня я на хосте тестировал плагин на работу с функциями считывания и записи файлов большого размера и они у меня тоже вызывали подобные ошибки (в частности функция считывания), пока я не сделал считывание по кусочкам

plamar (13:01:34 10/03/2010)

$fp = fopen($filename, "r+");

$contents = '';

while (!feof($fp))

{

$contents .= fread($fp, 8192);

}

fclose($fp);

так вот у меня такие мысли по этому поводу: может быть на хосте каким-то образом где-то зависла память, которая выделялась для моего приложения?

ОБРАТИТЕ ВНИМАНИЕ - очень вряд ли, что ошибка в скрипте, ведь старая версия (которая на тех же входных данных хорошо работала, сейчас выдает такую же ошибку).

plamar добавил 10.03.2010 в 18:01

Вот нашел подобную проблему с wp_insert_post - http://wordpress.org/support/topic/185342. Но приведенное там решение не помогает вроде

ewg777
На сайте с 04.06.2007
Offline
225
#3

Какой размер файла пытаетесь открыть?

[Удален]
#4
ewg777:
Какой размер файла пытаетесь открыть?

оговорюсь, файл вообще не причем. Я даже отключил возможность открывать файлы сейчас. Проблема в wp_insert_post. Без нее - все работает.

plamar добавил 10.03.2010 в 18:22

Там какая то проблема с тем, что запрос сначала кешируется, а потом выполняется, из за этого всплеск использования памяти.

ewg777
На сайте с 04.06.2007
Offline
225
#5
plamar:
оговорюсь, файл вообще не причем. Я даже отключил возможность открывать файлы сейчас. Проблема в wp_insert_post. Без нее - все работает.

plamar добавил 10.03.2010 в 18:22
Там какая то проблема с тем, что запрос сначала кешируется, а потом выполняется, из за этого всплеск использования памяти.

Извиняюсь. Не читал Ваши посты.

[Удален]
#6

Определил очень интересную закономерность: ошибка вылазит только если я ставлю время публикации постов в будущем (то есть планирую публикацию). И все работает, если не делать запланированных постов

plamar добавил 10.03.2010 в 21:54

В общем (если кому интересно), проблема (скачок потребления памяти) локализована в данной функции:


function wp_transition_post_status($new_status, $old_status, $post) {
do_action('transition_post_status', $new_status, $old_status, $post);
do_action("${old_status}_to_$new_status", $post);
do_action("${new_status}_$post->post_type", $post->ID, $post);
}

plamar добавил 11.03.2010 в 08:35

В общем проблема действительно в этой функции (причем именно тогда, когда планируем будущий пост). Сейчас покажу:


function wp_transition_post_status($new_status, $old_status, $post) {

echo memory_get_peak_usage();echo "-".$new_status."MET0<br>";

do_action('transition_post_status', $new_status, $old_status, $post);

echo memory_get_peak_usage();echo "-".$new_status."MET1<br>";

do_action("${old_status}_to_$new_status", $post);

echo memory_get_peak_usage();echo "-".$new_status."MET2<br>";

do_action("${new_status}_$post->post_type", $post->ID, $post);

echo memory_get_peak_usage();echo "-".$new_status."MET3<br>";
}

И после этого получаем такой результата:

18747184-futureMET0

24676648-futureMET1

24676648-futureMET2

38540144-futureMET3

Теперь вопрос к спецам по вордпрессу: как переопределить эту функцию, чтобы она могла правильно запланировать пост, но не вызывала эти функции по умолчанию?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий