Назад | Перейти на главную страницу

Как стандартная установка Wordpress может сломать PHP?

Я пытаюсь разместить сайт Wordpress в корневом каталоге стандартной установки Apache в Ubuntu 14.04. Главная страница сайта загружается нормально, но любая другая страница вызывает сообщение «данные не получены» в браузере и ошибку segfault в журнале apache:

[Wed Sep 17 09:47:57.278168 2014] [core:notice] [pid 26097] AH00051: child pid 26123 exit signal Segmentation fault (11), possible coredump in /etc/apache2

Я могу использовать gdb для подключения к процессу, попытаться загрузить связанную страницу, и вот что я вижу:

Program received signal SIGSEGV, Segmentation fault. _zend_mm_free_int (heap=0x7f7370b94920, p=0x7f735c138880) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_alloc.c:2104 2104 /build/buildd/php5-5.5.9+dfsg/Zend/zend_alloc.c: No such file or directory.

Я загрузил символы отладки для Apache2 и PHP5, и это след:

#0  _zend_mm_free_int (heap=0x7f7370b94920, p=0x7f735c138880) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_alloc.c:2104
#1  0x00007f736b4b7d55 in i_zval_ptr_dtor (zval_ptr=0x7f735c138880) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_execute.h:82
#2  zend_do_fcall_common_helper_SPEC (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:633
#3  0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108af0) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#4  0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#5  0x00007f736b4b8300 in zend_do_fcall_common_helper_SPEC (execute_data=0x7f7370108960)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:584
#6  0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108960) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#7  0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#8  0x00007f736b4b8300 in zend_do_fcall_common_helper_SPEC (execute_data=0x7f7370108828)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:584
#9  0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108828) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#10 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#11 0x00007f736b4b8300 in zend_do_fcall_common_helper_SPEC (execute_data=0x7f7370108710)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:584
#12 0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108710) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#13 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#14 0x00007f736b4b658c in ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER (execute_data=0x7f7370108600)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:30964
#15 0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108600) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#16 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#17 0x00007f736b4b8300 in zend_do_fcall_common_helper_SPEC (execute_data=0x7f7370108480)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:584
#18 0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108480) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#19 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#20 0x00007f736b4b8300 in zend_do_fcall_common_helper_SPEC (execute_data=0x7f7370108370)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:584
#21 0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108370) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#22 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#23 0x00007f736b4b658c in ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER (execute_data=0x7f7370108288)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:30964
#24 0x00007f736b4319e8 in execute_ex (execute_data=0x7f7370108288) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#25 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#26 0x00007f736b4b7241 in ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER (execute_data=0x7f73701081a0)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:8053
#27 0x00007f736b4319e8 in execute_ex (execute_data=0x7f73701081a0) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#28 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#29 0x00007f736b4b7241 in ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER (execute_data=0x7f73701080a0)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:8053
#30 0x00007f736b4319e8 in execute_ex (execute_data=0x7f73701080a0) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_vm_execute.h:363
#31 0x00007f736b3f7b59 in dtrace_execute_ex (execute_data=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/Zend/zend_dtrace.c:73
#32 0x00007f736b4095e0 in zend_execute_scripts (type=type@entry=8, retval=retval@entry=0x0, file_count=file_count@entry=3)
    at /build/buildd/php5-5.5.9+dfsg/Zend/zend.c:1316
#33 0x00007f736b3a94c5 in php_execute_script (primary_file=primary_file@entry=0x7ffff71b7b40)
    at /build/buildd/php5-5.5.9+dfsg/main/main.c:2506
#34 0x00007f736b4b993a in php_handler (r=<optimized out>) at /build/buildd/php5-5.5.9+dfsg/sapi/apache2handler/sapi_apache2.c:667
#35 0x00007f7370269680 in ap_run_handler (r=0x7f7370093130) at config.c:169
#36 0x00007f7370269bc9 in ap_invoke_handler (r=r@entry=0x7f7370093130) at config.c:439
#37 0x00007f737027ec2c in ap_internal_redirect (new_uri=<optimized out>, r=<optimized out>) at http_request.c:644
#38 0x00007f7369abdcfc in handler_redirect (r=0x7f73700990a0) at mod_rewrite.c:5063
#39 0x00007f7370269680 in ap_run_handler (r=0x7f73700990a0) at config.c:169
#40 0x00007f7370269bc9 in ap_invoke_handler (r=r@entry=0x7f73700990a0) at config.c:439
#41 0x00007f737027f16a in ap_process_async_request (r=0x7f73700990a0) at http_request.c:317
#42 0x00007f737027f444 in ap_process_request (r=r@entry=0x7f73700990a0) at http_request.c:363
#43 0x00007f737027bf02 in ap_process_http_sync_connection (c=0x7f737009f290) at http_core.c:190
#44 ap_process_http_connection (c=0x7f737009f290) at http_core.c:231
#45 0x00007f7370272cc0 in ap_run_process_connection (c=0x7f737009f290) at connection.c:41
#46 0x00007f73702730a8 in ap_process_connection (c=c@entry=0x7f737009f290, csd=<optimized out>) at connection.c:202
#47 0x00007f736caaa767 in child_main (child_num_arg=child_num_arg@entry=5) at prefork.c:704
#48 0x00007f736caaa9a6 in make_child (s=0x7f73701d8de0, slot=5) at prefork.c:800
#49 0x00007f736caab60e in perform_idle_server_maintenance (p=<optimized out>) at prefork.c:902
#50 prefork_run (_pconf=<optimized out>, plog=<optimized out>, s=<optimized out>) at prefork.c:1090
#51 0x00007f737025069e in ap_run_mpm (pconf=0x7f7370206028, plog=0x7f73701d4028, s=0x7f73701d8de0) at mpm_common.c:96
#52 0x00007f7370249e36 in main (argc=3, argv=0x7ffff71b82e8) at main.c:777

Во-первых, зачем вообще Зенд? Я предполагаю, что именно так построен PHP. Я раскомментировал одну строку в php5.ini, которая ссылается на нее, но это ничего не изменило.

Кажется достаточно ясным, что вызов для загрузки связанной страницы на сайте Wordpress проходит через mod_rewrite (как и должно), передается PHP, а затем теряется в кучке под-вызовов к zend_vm_execute где он в конечном итоге, похоже, ищет исходный файл, который не установлен. Нужно ли мне устанавливать какую-либо другую часть Zend на мою установку? Не похоже, чтобы для этого мне пришлось устанавливать несвободные программы.

Я только что нашел ошибку? Не похоже, что что-то настолько простое, как стандартная установка Wordpress, может выявить скрытую проблему.

Единственная другая часть головоломки заключается в том, что я переместил этот сайт с общего хоста на выделенный сервер. я использовал https://github.com/interconnectit/Search-Replace-DB чтобы отсортировать изменение в URL. Он работал, когда я его настраивал и использовал неделю назад, а теперь это не так. Я просмотрел все журналы за прошедшую неделю, и там ничего нет, кроме нескольких статусных сообщений. Я ничего не устанавливал и не менял с тех пор, как это работало. Я пошел обновлять сайт сегодня утром и обнаружил, что он сломан.

Поскольку страница по умолчанию и панель инструментов работают, я использовал страницу wp-admin, чтобы изменить конфигурацию постоянной ссылки на значение по умолчанию, и переместил стандартный файл .htaccess в сторону. Другая обратная трассировка показала, что mod_rewrite теперь не работает, но проблема сохраняется.

Я обнаружил ту же ошибку при установке Drupal (Ubuntu 14, PHP-5.5.9) с довольно тяжелой темой.

Очевидно, что первым подозреваемым в этих случаях является код PHP. Но gdb не дал никаких подсказок о пользовательском коде и указал на zend_alloc.c, как в вашем случае.

Хорошо, похоже, что некоторые (игнорируемые) условия приводят к сбою движка Zend.

Затем я начал экспериментировать с конфигурацией OPCache и, наконец, смог найти причину.

В моем случае в установке было несколько vhosts, при этом OPCache изначально был включен, а затем отключен в некоторых vhosts ... особенно в том, который дал ошибку сегментации.

Просто включите OPCache для этого конкретного виртуального хоста или просто отключите OPCache для общей установки, и ошибки сегментации исчезнут.

Кажется, что другая конфигурация OPcache между vhosts плюс некоторые (игнорируемые) условия PHP вызывают проблему, хотя это не должно быть.

Некоторый свет на это действительно был бы оценен ...