У меня есть приложение, которое я пишу на PHP5, используя фреймворк CodeIgniter. У меня он работает как в Windows (с использованием Xampp), так и в Ubuntu (с использованием стандартного стека Apache, PHP, MySQL).
У меня есть форма, которая принимает XML, анализирует его (используя simpleXML) и отправляет результаты в базу данных.
На Windows - без проблем, работает как задумано.
На Linux - большая проблема. Это ошибки.
Я дважды проверил XML, и все в порядке.
Я удалил большую часть XML, и, похоже, все в порядке.
Я думаю, это связано с размером XML-строки, отправляемой из формы, но я не уверен. Опять же, в Windows все нормально - в Linux выдает ошибки.
Размер данных, размещаемых в форме, составляет ~ 160 КБ (да, это много текста, но он автоматизирован - И в конечном итоге он будет около 200 КБ).
Ошибка ниже.
Любая помощь очень ценится.
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /var/www/ci/system/application/controllers/system.php:49 Stack trace: #0 /var/www/ci/system/application/controllers/system.php(49): SimpleXMLElement->__construct('') #1 [internal function]: System->add_system() #2 /var/www/ci/system/codeigniter/CodeIgniter.php(233): call_user_func_array(Array, Array) #3 /var/www/ci/index.php(115): require_once('/var/www/ci/sys...') #4 {main} thrown in /var/www/ci/system/application/controllers/system.php on line 49
Строка 49 выглядит так:
$xml = new SimpleXMLElement($this->input->post('form_systemXML'));
РЕДАКТИРОВАТЬ - ИСПРАВЛЕНО
Нашел проблему. Suhosin установлен в Ubuntu. в файле /etc/php5/apache2/conf.d/suhosin.ini я включил строку suhosin.post.max_value_length = 65000 и изменил значение на 195000. Перезапустил Apache, и все в порядке. Спасибо за указатели, ребята.






Возможно, вы уже пробовали этот подход, но проверяли ли вы окончания строк? \ r \ n (DOS) в отличие от \ n (UNIX)? Может случиться так, что регулярные выражения, которые использует simpleXML, могут быть запутаны ими на разных платформах ...
$ x = новый SimpleXmlElement ($ a1); print_r ($ x); Объект SimpleXMLElement ([tag1] => Объект SimpleXMLElement ([tag2] => Объект SimpleXMLElement ([0] =>)))
Хорошая попытка. XML-строка является сгенерирована в Windows, поэтому я заменил все окончания строк (unix2dos -u -o filename) в Ubuntu. Без разницы.
Пожалуйста, проверьте свою конфигурацию PHP в окне Linux и сравните ее с настройками Windows. Особенно следующие настройки:
Возможно, вы сможете сделать дамп данных, отправленных в скрипт
print_r($_POST);
чтобы увидеть, какие данные действительно поступают на сервер.
memory_limit: linux 16m, Windows 32m post_max_size: linux 8m, Windows 16m Необходимо изменить настройки linux и посмотреть, что произойдет.
Блин - обновил и перезапустил Apache (и дважды проверил с помощью phpinfo ()) - без изменений. Та же ошибка.
Пытался добавить print_r ($ _ POST), но все, что вернулось, было Array ([submit] => Submit) вместе с существующим сообщением об ошибке. Должна быть переменная для "form_systemXML". Не уверен ... может быть, конфиг apache?
Я сократил ввод XML с 2870 строк до 990. Работал нормально. Уверена, это связано с размером ...
Обновление - нашел это в системном журнале
4 ноября 21:53:32 ubu804 suhosin [7944]: ALERT - превышен предел длины настроенного значения переменной запроса - удалена переменная 'form_systemXML' (злоумышленник '127.0.0.1', файл '/var/www/ci/index.php')
Сейчас смотрю конфигурацию apache.
Похоже, вы используете расширение Сухосин PHP. См. Документацию по настройке по адресу: http://www.hardened-php.net/suhosin/configuration.html.
Соответствующий вариант кажется (я никогда не использовал расширение Suhosin): suhosin.post.max_value_length и / или suhosin.request.max_value_length
SimpleXML не заботится об используемых окончаниях строк. $ a1 = "<root> \ n <tag1> \ r \ n <tag2> \ r </tag2> </tag1> </root>";