公司给我新安排了一个已运行项目接手,负责维护和小修小改,作为一名资深开发者,我自然没把这个项目放在眼里。
项目采用Magento开发,我拿到管理密码后,也没有看任何文档,三下五除二直接上服务器拉源码,按照以往的经验部署好测试环境,按理说到这就可以继续开发了,谁知道老革命遇上了新问题,项目直接报错,根本跑不起来!
谁知道这仅仅是噩梦的开始,接下来的一周时间里,我都在“部署环境->安装程序->删除环境"的循环里惊恐的渡过,我跟家人说:”我可能要失业了”。
因为Mogento国内使用的可能还不多,可参考的文档很少,而且这套系统比较讨厌,每个版本的环境要求都可能不一样,并且Windows上部署采坑的几率也会大很多,下来我就逐步说明一下如何在Windows系统上部署Mangento,总结我这一周的遭遇,让后来者不再踩坑。
开始之前先着重说明一下,开发环境为:Win10 + Apahce2.3.4 + PHP 7.4.30(cli) + MySQL 5.7 + Rides(cli) 3.2 + Composer 2.3 + Magento 2.3.7(release),全手动安装,没有使用面板。
按照通常方式安装好Apache,在conf目录中打开httpd.conf,去掉167、187行的注释,打开mod_rewrite.so和mod_version.so,然后设置好站点,在277行中将AllowOverride None改为AllowOverride All。根据站点设置方式的不同,此处修改可能会在其他文件当中,总之开启站点的伪静态就可以了。
安装好PHP,打开php.ini的 ext-bcmath、ext-ctype、ext-curl、ext-dom、ext-fileinfo、ext-gd、ext-hash、ext-iconv、ext-intl、ext-json、ext-libxml、ext-mbstring、ext-openssl、ext-pcre、ext-pdo_mysql、ext-simplexml、ext-soap、ext-sockets、ext-sodium、ext-spl、ext-tokenizer、ext-xmlwriter、ext-xsl、ext-zip、lib-libxml、lib-openssl 扩展,共计26个扩展项目。
先将下载好的源码解压至站点目录,假如根目录为:magento。
使用命令行(也就是cms)进入站点根目录,执行以下命令
magento>composer install
此时系统会自动从网络上下载所需要的依赖包,根据网速情况,用时约3~5分钟。
Magento大概天生没想着在windows进行部署,所以会有一些路径转义的问题,先来修改一个文件。打开 lib\internal\Magento\Framework\Image\Adapter\Gd2.php,在第86行找到函数 function validateURLScheme,进行如下修改:
private function validateURLScheme(string $filename) : bool
{
$allowed_schemes = ['ftp', 'ftps', 'http', 'https'];
$url = parse_url($filename);
//if ($url && isset($url['scheme']) && !in_array($url['scheme'], $allowed_schemes)) {
if ($url && isset($url['scheme']) && !in_array($url['scheme'], $allowed_schemes) && !file_exists($filename)) {
return false;
}
return true;
}
注意,这次执行目录要切换到bin,命令如下:
magento/bin>php magento setup:install --base-url=http://127.0.0.1/ --db-host=127.0.0.1 --db-name=magento --db-user=root --db-password=1234 --admin-firstname=aaa --admin-lastname=bbb --admin-email=1111@qq.com --admin-user=admin --admin-password=admin123 --language=en_US --currency=USD --timezone=America/Chicago --use-rewrites=0 --backend-frontname="admin"
base-url 相当于绑定域名,安装好的系统访问时会自动跳转到这个地址,可以写域名,也可以写ip
db-host、db-name、db-user、db-password是Mysql数据库信息,这个根据你的开发环境实际情况填写
admin-first、admin-lastname、admin-emai是必填项,有就可以
admin-user和admin-password是登录后台的账号、密码,这个要记好,不然安装完了没法登录
backend-frontname是后台访问路径,如果不指定,会随机生成一个admin_xxxxxx的随机地址
安装完成后会显示类似这样的提示信息:
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin_xxxxxx
Nothing to import.
现在虽然安装完成了,但是访问站点会发现没有样式,pub/static/ 目录下没有静态文件,此时需要执行一次如下命令:
php magento setup:static-content:deploy -f
当出现如下提示信息,就算是完成了
Deploy using quick strategy
adminhtml/Magento/backend/en_US 2293/2293 ============================ 100% 6 secs
frontend/Magento/blank/en_US 2287/2287 ============================ 100% 5 secs
frontend/Magento/luma/en_US 2304/2304 ============================ 100% 8 secs
Execution time: 33.576869010925
此时你觉得应该安装完了,但是事实上......并没有,前面说了Magento大概没打算在windows上部署,所以还需要修改 lib\internal\magento\framework\View\Element\Template\File\Validator.php 的函数 isPathInDirectories,在 139 行添加一句 $realPath = str_replace('\\', '/', $realPath);,最终是这样的:
protected function isPathInDirectories($path, $directories)
{
if (!is_array($directories)) {
$directories = (array)$directories;
}
$realPath = $this->fileDriver->getRealPath($path);
$realPath = str_replace('\\', '/', $realPath);
foreach ($directories as $directory) {
if (0 === strpos($realPath, $directory)) {
return true;
}
}
return false;
}
至此,安装结束!
多说两句:首先,源码一定要从官方下载,否则可能会有文件缺失,导致一些莫名其妙的问题;其次,一定要确认版本号和系统环境需求,Magneto系统即便是小版本号的区别,对环境要求也是天壤之别。
如有问题欢迎留言或者私信沟通。
源码下载 https://github.com/magento/magento2/
开发文档 Installation flow | Adobe Commerce Developer Guide