1С-Битрикс, PHP Fatal error: Allowed memory size, cron и конфигурационные опции PHP
Имеем 1С-Битрикс и PHP скрипт, который работает по cron без проблем, стал отваливаться с ошибкой:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 28352 bytes) in /home/b/ваш_аккаунт_beget/ваш_домен/public_html/bitrix/modules/main/classes/general/file.php on line 2470
Первым делом я локализовал проблему и нашел, что скрипт отваливается после вызова метода битрикса, который устанавливает множественное свойство типа файл:
CIBlockElement::SetPropertyValuesEx($ID_IMG, 11, array('photos' => $arFile_img));
Параметры передаваемые в CIBlockElement::SetPropertyValuesEx()
:
31417416 - размер памяти до вызова "CIBlockElement::SetPropertyValueCode($ID_IMG, ‘photos’, $arFile_img_del);"
string(5) “15129” - ID элемента($ID_IMG)
// ниже массив $arFile_img
Array
(
[0] => Array
(
[VALUE] => Array
(
[name] => TEST000000000003003601_0.jpg
[size] => 537825
[tmp_name] => /home/b/ваш_аккаунт_beget/ваш_домен/public_html/upload/tmp/img/TEST000000000003003601_0.jpg
[type] => image/jpeg
)
)
)
Дальше стал изучать кишки bitrix/modules/main/classes/general/file.php
Но это не дало результатов, вызвав функции используемые в этом файле
<?php
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
header('Content-Type: image/jpeg');
$img = CFile::ImageHandleOrientation(2, '/home/b/ваш_аккаунт_beget/ваш_домен/public_html/upload/tmp/img/000000000003003601_0.jpg');
imagejpeg($img);
imagedestroy($img);
я получил нормальную картинку. На этом этапе мысли кончились, стал писать в ТП бегета и битрикса. Но отвечают они медленно...
К вечеру дня, уже сидев в состоянии глубокого транса, я решил вызвать этот скрипт, просто в браузере... И О, боже! Все заработало.
Как выяснилось в бегете при запуске PHP скриптов из под cron конфигурационные опции PHP, эти:
Настроенные для вашего домена не используются! Эту ошибку я не замечал потому, что для маленьких фоток хватало стандартной памяти memory_limit.
Теперь в планировщике заданий beget вместо вызова:
/usr/bin/php -d mbstring.func_overload=2 ~/ваш_домен/public_html/bigbox_scripts/cron/import_tovars.php
я использую:
/usr/bin/php -d memory_limit=1024M -d mbstring.func_overload=2 ~/ваш_домен/public_html/bigbox_scripts/cron/import_tovars.php
Тоесть устанавливаю дополнительно memory_limit=1024M для PHP
Комментарии
Добавить комментарий