Laravel与WordPress的__函数冲突,runkit7移除函数失败报502错误
函数冲突与runkit7操作失败解决方案
环境信息
- PHP版本:
PHP 8.1.23 (cli) (built: Sep 15 2023 21:56:29) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.23, Copyright (c) Zend Technologies with Zend OPcache v8.1.23, Copyright (c), by Zend Technologies
- runkit7版本:4.0.0a6
- 操作系统版本:
NAME="Amazon Linux" VERSION="2" ID="amzn" ID_LIKE="centos rhel fedora" VERSION_ID="2" PRETTY_NAME="Amazon Linux 2" ANSI_COLOR="0;33" CPE_NAME="aaaa:amazon:amazon_linux:2" HOME_URL="https://amazonlinux.com/"
问题详情
Laravel的__辅助函数与WordPress同名函数冲突:
- WordPress的
__函数路径:public/wp/wp-includes/l10n.php - Laravel的
__函数路径:vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
尝试用runkit7_function_remove()移除Laravel的__函数解决冲突,但操作无效,且Nginx日志出现502错误,示例代码如下:
$user = Auth::user(); error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED); try { // 移除Laravel的__辅助函数 if (function_exists('__')) { runkit7_function_remove('__'); } } catch(\Exception $e){ Log::debug($e->message); } define('WP_USE_THEMES', true); require(public_path() . '/wp/wp-blog-header.php');
解决方案
方案一:绕过runkit,重定义过渡函数
不需要依赖runkit修改已加载函数,在WordPress加载前重新定义__函数,实现动态转发:
$user = Auth::user(); // 保存Laravel原函数引用 $laravelTranslate = function_exists('__') ? '__' : null; // 重新定义__函数作为过渡 function __($text, $domain = 'default') { global $laravelTranslate; // WordPress未加载时调用Laravel实现 if (!function_exists('wp_translate') && $laravelTranslate) { return $laravelTranslate($text, $domain); } // WordPress加载后调用其实现 return wp_translate($text, $domain); } define('WP_USE_THEMES', true); require(public_path() . '/wp/wp-blog-header.php');
方案二:修复runkit7的502错误
runkit操作引发502通常是扩展配置或OPcache冲突导致:
- 编辑php.ini,开启runkit内部函数修改权限:
runkit7.internal_override = On - 禁止OPcache缓存Laravel的helpers.php,避免函数被锁定:
在php.ini中添加:
然后在opcache.blacklist_filename = /etc/php.d/opcache-blacklist.txtopcache-blacklist.txt中写入:vendor/laravel/framework/src/Illuminate/Foundation/helpers.php - 重启PHP-FPM和Nginx,让配置生效。
方案三:放弃全局函数,用命名空间调用
彻底避免全局冲突,直接使用对应框架的命名空间方法:
- Laravel翻译:用
Illuminate\Support\Facades\Lang::get($text, [], $domain)代替__() - WordPress翻译:加载后用
wp_translate($text, $domain)代替全局__()
内容的提问来源于stack exchange,提问作者YanKyawMin
相关产品推荐
相关产品推荐

