php报错:PHP Startup Unable to load dynamic library

今天遇到使用php命令运行文件报错,提示:PHP Startup: Unable to load dynamic ,于是网上找了好多资料,终于解决,记录如下,以便日后查阅。

报错内容如下:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/redis.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/redis.so: undefined symbol: zend_ce_exception in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/memcached.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/memcached.so: undefined symbol: zend_hash_str_del in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/swoole.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/swoole.so: undefined symbol: zend_hash_str_del in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/curl.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/curl.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/dom.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/dom.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/fileinfo.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/fileinfo.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/json.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/json.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/phar.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/phar.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/posix.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/posix.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvmsg.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvmsg.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvsem.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvsem.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvshm.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/sysvshm.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/wddx.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/wddx.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xmlreader.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xmlreader.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xmlwriter.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xmlwriter.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xsl.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xsl.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/zip.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/zip.so: cannot open shared object file: No such file or directory in Unknown on line 0

解决方法:
将/etc/php.d/目录下的.ini文件全部重命名为.so文件

如:cp /etc/php.d/zip.ini /etc/php.d/zip.so

按照以上方法处理完之后,还是有三个警告:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/redis.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/redis.so: undefined symbol: zend_ce_exception in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/memcached.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/memcached.so: undefined symbol: zend_hash_str_del in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/swoole.so' - /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/swoole.so: undefined symbol: zend_hash_str_del in Unknown on line 0

原来是这三个扩展被重复加载了,打开php.ini文件,注释扩展加载的地方即可

vi /etc/php.ini # 将redis、memcache、swoo加载的地方注释即可
/etc/init.d/php-fpm restart
<think>这个错误通常发生在PHP尝试加载openssl扩展时失败。可能的原因包括: 1. 扩展文件不存在或路径错误 2. 扩展文件与当前PHP版本不兼容(如32位与64位不匹配) 3. 依赖缺失(如OpenSSL库未安装) 4. 权限问题 解决步骤: 步骤1:确认扩展文件存在 查找php.ini中设置的extension_dir路径,并检查该目录下是否存在php_openssl.dll(Windows)或openssl.so(Linux)。 步骤2:检查php.ini配置 确保php.ini中已经启用了openssl扩展(取消注释或添加): extension=openssl 或 extension=php_openssl.dll (Windows) 步骤3:检查依赖 在Linux下,确保已经安装了openssl和openssl-devel(或类似名称的包)。 步骤4:检查系统环境变量(Windows) 确保PHP安装目录在系统PATH中,以便找到依赖的DLL(如libeay32.dll和ssleay32.dll,或新版本中的libcrypto.dll和libssl.dll)。 步骤5:检查日志 查看PHP错误日志以获取更详细的错误信息。 以下是一个诊断脚本,可以帮助确定问题原因: ```php <?php // 检查扩展是否已经加载 if (!extension_loaded('openssl')) { echo "OpenSSL 扩展未加载。尝试诊断原因...\n"; // 检查扩展目录设置 $extDir = ini_get('extension_dir'); echo "扩展目录: " . $extDir . "\n"; // 检查扩展文件是否存在 $extFile = (PHP_OS_FAMILY === 'Windows') ? 'php_openssl.dll' : 'openssl.so'; $extPath = rtrim($extDir, '/\\') . DIRECTORY_SEPARATOR . $extFile; if (!file_exists($extPath)) { echo "错误: 扩展文件 '$extFile' 在目录 '$extDir' 中不存在.\n"; } else { echo "扩展文件存在: $extPath\n"; // 尝试加载扩展 if (@dl($extFile)) { echo "动态加载成功。\n"; } else { echo "动态加载失败。请检查文件权限或依赖。\n"; } } // 检查依赖(Windows下需要检查DLL依赖) if (PHP_OS_FAMILY === 'Windows') { $requiredDlls = ['libeay32.dll', 'ssleay32.dll', 'libssl.dll', 'libcrypto.dll']; $path = getenv('PATH'); $paths = explode(PATH_SEPARATOR, $path); $missingDlls = []; foreach ($requiredDlls as $dll) { $found = false; foreach ($paths as $dir) { if (file_exists($dir . DIRECTORY_SEPARATOR . $dll)) { $found = true; break; } } if (!$found) { $missingDlls[] = $dll; } } if ($missingDlls) { echo "缺少以下依赖DLL: " . implode(', ', $missingDlls) . "\n"; echo "请将这些DLL放在PHP安装目录或者系统PATH包含的目录中。\n"; } } } else { echo "OpenSSL 扩展已加载。\n"; } ``` 常见解决方案: 1. Windows下: - 确保PHP安装目录下的`libcrypto.dll`和`libssl.dll`(或旧版的`libeay32.dll`和`ssleay32.dll`)存在,并且PHP安装目录已添加到系统PATH环境变量。 - 或者将这些DLL文件复制到系统目录(如C:\Windows\System32)但不推荐。 2. Linux下: - 安装openssl和开发包: Ubuntu/Debian: `sudo apt-get install openssl libssl-dev` CentOS/RedHat: `sudo yum install openssl openssl-devel` - 重新编译PHP的openssl扩展(如果必要): ``` cd /path/to/php/source/ext/openssl phpize ./configure make make install ``` 3. 如果使用XAMPP/WAMP等集成环境,尝试重新安装或更换版本。 4. 检查php.ini中extension_dir配置是否正确指向了包含扩展的目录。 5. 确保PHP版本与扩展文件匹配(例如,TS(线程安全)和NTS(非线程安全)版本不能混用)。 6. 检查文件权限(Linux下确保扩展文件可读)。 如果上述步骤无法解决,请提供以下信息以便进一步诊断: - 操作系统及版本 - PHP版本(使用phpinfo()输出) - 错误日志中的完整错误信息 §§相关问题§§: 1. 如何在不同的操作系统中安装和配置PHP扩展? 2. 如何解决PHP扩展依赖的共享库缺失问题? 3. 如何编译PHP扩展? 4. 在Windows环境下,如何正确设置PHP的环境变量? </think>这个警告表示PHP在启动时无法加载 `openssl` 扩展。这是一个常见问题,通常由配置不正确、路径问题或缺失依赖引起。以下是详细的解决方案: ### 完整解决方案 ```bash # 1. 确认系统中是否存在openssl扩展(Linux) php -m | grep openssl # 2. 检查扩展加载状态(Linux/Windows通用) php --ri openssl # 3. 验证扩展文件是否存在(Linux示例) ls /usr/lib/php/20210902/openssl.so # 4. 检查PHP配置文件路径 php --ini # 5. 在php.ini中添加/取消注释openssl扩展 # Windows示例: # extension=C:\php\ext\php_openssl.dll # Linux示例: # extension=openssl.so # 6. 检查依赖库(Linux) ldd /usr/lib/php/20210902/openssl.so # 7. 设置环境变量(Windows) # 将PHP目录添加到系统PATH环境变量(如C:\php) ``` ### 分步详解及解决方案 #### 1. 确认OpenSSL扩展是否安装 **Windows系统检查**: ```powershell # 检查PHP扩展目录(ext文件夹)中是否有php_openssl.dll文件 dir C:\php\ext\php_openssl.dll ``` **Linux系统检查**: ```bash # 检查OpenSSL扩展是否存在 find /usr -name 'openssl.so' 2>/dev/null ``` #### 2. 编辑php.ini配置 在php.ini中找到扩展配置部分: ```ini ; Windows系统 ; 取消注释或添加以下行(根据实际路径) extension_dir = "C:\php\ext" extension=openssl ; Linux系统 ; 取消注释或添加以下行 extension=openssl.so ``` #### 3. 解决依赖问题 **Linux解决方案**: ```bash # 安装OpenSSL开发库 sudo apt-get install libssl-dev # Ubuntu/Debian sudo yum install openssl-devel # CentOS/RHEL # 重新编译openssl扩展 cd /path/to/php-source/ext/openssl phpize ./configure --with-openssl make sudo make install ``` **Windows解决方案**: 1. 确保以下DLL文件存在于系统PATH路径或PHP目录中: - `libcrypto.dll` - `libssl.dll` 2. 从官方OpenSSL网站下载预编译版本:https://slproweb.com/products/Win32OpenSSL.html #### 4. 检查PHP版本兼容性 ```php <?php // 检查PHP版本和架构 echo "PHP版本: " . phpversion() . PHP_EOL; echo "系统架构: " . (PHP_INT_SIZE === 8 ? '64位' : '32位') . PHP_EOL; echo "线程安全: " . (ZEND_THREAD_SAFE ? '是' : '否') . PHP_EOL; ?> ``` 确保下载的OpenSSL扩展与PHP版本、架构(32/64位)和线程安全设置(TS/NTS)完全匹配。 #### 5. 环境变量配置(Windows) 1. 将PHP安装目录添加到系统PATH: ```powershell [Environment]::SetEnvironmentVariable( "Path", [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\php", [EnvironmentVariableTarget]::Machine ) ``` 2. 重启系统使变更生效 #### 6. 验证修复结果 ```bash # 检查OpenSSL扩展是否已加载 php -m | grep openssl # 验证OpenSSL功能 php -r "echo OPENSSL_VERSION_TEXT;" ``` ### 自动检测脚本 ```php <?php // openssl_diagnose.php echo "===== OpenSSL 扩展诊断工具 =====" . PHP_EOL; // 检查扩展是否加载 if (!extension_loaded('openssl')) { echo "❌ OpenSSL 扩展未加载" . PHP_EOL; // 检查配置 $iniPath = php_ini_loaded_file(); echo "使用的 php.ini 文件: " . ($iniPath ?: "未找到") . PHP_EOL; // 检查扩展目录 $extDir = ini_get('extension_dir'); echo "扩展目录: " . $extDir . PHP_EOL; // 检查扩展文件 $extFile = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? 'php_openssl.dll' : 'openssl.so'; $extPath = rtrim($extDir, '/\\') . DIRECTORY_SEPARATOR . $extFile; echo "扩展文件路径: " . $extPath . PHP_EOL; if (file_exists($extPath)) { echo "✅ 扩展文件存在" . PHP_EOL; echo "可能原因: " . PHP_EOL; echo "1. php.ini 中未启用扩展" . PHP_EOL; echo "2. 依赖库缺失 (Windows需要 libcrypto.dll 和 libssl.dll)" . PHP_EOL; echo "3. 架构不匹配 (32/64位, TS/NTS)" . PHP_EOL; } else { echo "❌ 扩展文件不存在" . PHP_EOL; echo "解决方案: " . PHP_EOL; echo "1. 下载正确的 PHP 扩展文件" . PHP_EOL; echo "2. 更新 extension_dir 路径" . PHP_EOL; } } else { echo "✅ OpenSSL 扩展已成功加载" . PHP_EOL; echo "OpenSSL 版本: " . OPENSSL_VERSION_TEXT . PHP_EOL; } // 检查基本功能 if (function_exists('openssl_encrypt')) { echo "✅ openssl_encrypt 函数可用" . PHP_EOL; } else { echo "❌ 基础功能不可用" . PHP_EOL; } ?> ``` ### 常见解决方案总结 | 问题类型 | 解决方法 | |----------|----------| | **扩展未启用** | 编辑php.ini取消注释`extension=openssl` | | **路径不正确** | 设置正确的`extension_dir`路径 | | **依赖缺失** | 安装libssl-dev (Linux) 或 添加DLL到PATH (Windows) | | **版本不匹配** | 下载与PHP版本/架构匹配的扩展 | | **权限问题** | 确保PHP有读取扩展文件的权限 | ### OpenSSL扩展依赖关系 ```mermaid graph TD A[PHP OpenSSL 扩展] --> B[Linux] A --> C[Windows] B --> D[libssl-dev] B --> E[libcrypto] B --> F[正确权限] C --> G[php_openssl.dll] C --> H[libcrypto.dll] C --> I[libssl.dll] C --> J[PATH环境变量] ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值