第一天只是环境初步配置好,浏览器打开还是有错,犹抱琵琶半遮面的。
第二天:解决这些错误
1. 500 Server Error
不是网上说的权限问题,找了半天日志在哪里,其实是在laravel\storage\logs下面。
日志提示:
[2020-05-27 06:58:26] production.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified.
处理方式:进入laravel目录,命令行执行
php artisan key:generate
又出现问题:
ErrorException
file_get_contents(D:\xiaoxiang-php7.4\laravel\.env): failed to open stream: No such file or directory
原因:git拉下来的laravel代码只有.env.example文件,没有.env文件
复制其改名为.env即可
2. 报错:Call to undefined function Illuminate\Encryption\openssl_cipher_iv_length()
网上找的答案都是说php.ini中开启extension=openssl,但昨天composer update的时候早就已经开启了,不是这个问题。
直接在命令行运行执行却发现有openssl_cipher_iv_length函数:
D:\>php -r "echo(openssl_cipher_iv_length('AES-128-CBC'));"
16
而在laravel的入口文件中最上面加上:
echo(function_exists("openssl_cipher_iv_length"));die;
输出空白,不存在这个函数。
分别用命令行和浏览器查看phpinfo,
D:\>php -r "echo(phpinfo());"
echo(phpinfo());die;
两个显示的Loaded Configuration File都是一样,但是浏览器看到的extension不只是openssl,其他bz2、mbstring之类的全部都没有加载进来。
查了半天找不到原因,突然想到是不是apache的问题,去apache的error.log,果然发现问题:
PHP Warning: PHP Startup: Unable to load dynamic library 'bz2' (tried: ext\\bz2 (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82), ext\\php_bz2.dll (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: ext\\curl (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82), ext\\php_curl.dll (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'mbstring' (tried: ext\\mbstring (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82), ext\\php_mbstring.dll (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: ext\\mysqli (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82), ext\\php_mysqli.dll (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'openssl' (tried: ext\\openssl (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82), ext\\php_openssl.dll (\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82)) in Unknown on line 0
“\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\xa8\xa1\xe5\x9d\x97\xe3\x80\x82”翻译过来是:“找不到指定的模块。”
于是去php.ini中修改extension_dir,原本是ext,改为完整的路径
extension_dir = "ext"
extension_dir = "D:/php-7.4.6/ext"
现在bz2、mbstring可以加载了,但curl和openssl还是同样的问题。
继续网上找发现一个说下载libcrypto*.dll和libssl*.dll放到php和apache的bin目录的。
我这边php目录下面是有的,直接复制到apache的bin目录。
openssl可以加载了。但curl还是加载不了,不知道是哪个文件。
现在laravel终于可以看了,就没管curl了。
最后思考,我只把php的目录路径加入我用户的环境变量的PATH中,apache服务使用的系统服务用户,所以它的环境变量PATH中没有php的目录路径,造成这些的问题。
实际上应该可以直接将php的目录路径加入系统环境变量的PATH中,不需要修改php.ini的extension_dir为绝对路径,也不需要复制文件到apache的bin目录。以后再实验。