Phpseclib类加载失败求助:Composer自动加载未生效问题排查
问题描述
我按照安装说明创建文件夹、运行Composer,获取到lock文件与vendor目录后部署至GoDaddy服务器。编写了包含Decrypt函数的PHP文件,引入vendor/autoload.php后出现PHP Fatal error: Uncaught Error: Class未找到错误。尝试手动引入Rijndael.php后,又出现BlockCipher相关报错,我知道这并非正确做法,疑惑为何自动加载未生效。
原代码
<?php require __DIR__ . '/vendor/autoload.php'; $ky = '2345678901234567890123456789012'; // 32 * 8 = 256 bit key $iv = '2345678901234567890123456789012'; // 32 * 8 = 256 bit iv function Decrypt($string_to_decrypt) { global $ky; global $iv; $cipher = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CBC); $cipher->setBlockLength(256); $cipher->setKeyLength(256); $cipher->setKey($ky); $cipher->setIV($iv); $rtn= $cipher->decrypt($string_to_decrypt); error_log('decrypt = '. $rtn, 0); return($rtn); }
手动引入代码
include('/home/n28d5aun99s6/public_html/Working/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php');
问题原因与解决办法
命名空间未正确使用:phpseclib 2.x及以上版本采用命名空间机制,
Crypt_Rijndael是1.x版本的类名写法,新版本类位于phpseclib\Crypt命名空间下。修改代码如下:<?php require __DIR__ . '/vendor/autoload.php'; // 引入命名空间 use phpseclib\Crypt\Rijndael; $ky = '2345678901234567890123456789012'; $iv = '2345678901234567890123456789012'; function Decrypt($string_to_decrypt) { global $ky; global $iv; // 使用命名空间下的类 $cipher = new Rijndael(Rijndael::MODE_CBC); $cipher->setBlockLength(256); $cipher->setKeyLength(256); $cipher->setKey($ky); $cipher->setIV($iv); $rtn= $cipher->decrypt($string_to_decrypt); error_log('decrypt = '. $rtn, 0); return $rtn; }autoload.php路径错误:验证
__DIR__ . '/vendor/autoload.php'是否指向正确的文件路径。可以添加调试代码确认:$autoloadPath = __DIR__ . '/vendor/autoload.php'; if (!file_exists($autoloadPath)) { die("自动加载文件不存在:{$autoloadPath}"); } require $autoloadPath;若路径错误,根据实际目录结构调整,比如文件在子目录时可能需要
__DIR__ . '/../vendor/autoload.php'。Composer自动加载缓存未更新:部署后在服务器上执行以下命令重新生成自动加载映射:
cd /home/n28d5aun99s6/public_html/Working composer dump-autoload版本兼容问题:如果你的代码是为phpseclib 1.x编写的,可指定安装兼容版本:
composer require phpseclib/phpseclib:^1.0但建议优先适配新版本,1.x已停止维护,存在安全风险。
内容的提问来源于stack exchange,提问作者Clint Garrity
相关产品推荐
相关产品推荐

