# 使用常见问题
## Q:安装环境检测提示缺少 xxx 扩展
编辑 `php.ini` 文件,找到 `extension=xxx` 相关配置,删除前面的分号 `;` 。
例如:
```
;extension=exif.so
```
修改为
```
extension=exif.so
```
注意:Windows 系统的扩展后缀名为 `.dll` ,Linux 系统的扩展后缀名为 `.so`。
如果使用的是宝塔环境,只需要在 `PHP` → 设置 → 扩展管理 启用该扩展。
以上操作完成后需要重启 PHP 服务才能生效。
## Q:安装环境检查提示缺少 xxx 函数
编辑 `php.ini` 文件,找到 `disable_functions` 并将其中的 `xxx` 函数移除,然后重启服务器即可。
为什么要使用这些函数?
- `proc_open` : Laravel 执行 `artisan` 命令时需要用到
- `proc_get_status` : Laravel 执行 `artisan` 命令时需要用到
- `putenv` : Laravel 执行 `artisan` 命令时需要用到
如果使用的是宝塔环境,只需要在 `PHP` → 设置 → 禁用函数 删除该函数。
以上操作完成后需要重启 PHP 服务才能生效。
## Q:安装模块后系统报错打不开
- 第1步,删除安装的模块 `module/Xxx` 目录,尝试刷新页面打开,如果打不开请执行第2步
- 第2步,清除缓存(删除 `bootstrap/cache/` 和 `storage/framework/cache/` 目录中的所有文件,注意不要删除目录本身),完成后重试
## Q:系统后台一键升级后系统报错
后台一键升级前请备份系统的完整文件和数据库,如果系统有自定义开发,升级不保证不会破坏系统原有数据。
如遇到报错打不开请按照如下步骤排查
- 第1步,打开调试日志(设置 .env 文件中 APP_DEBUG=true)
- 第2步,查看系统的错误信息,进行排查
## Q:Rewrite规则
在安装过程中,伪静态错误是经常会出现的问题,可以根据以下几种方式进行排错:
如果确信伪静态规则无误,可以通过访问 `http://你的域名/install/ping` 来访问,如果页面结果为OK则表示伪静态配置成功。
### 基础准备工作
基础工作的准备可以让你更快的定位错误
- 第一步,打开调试(配置 .env 文件中 APP_DEBUG=true),可以让错误显示在页面上,方便调试
- 第二步,配置服务器的网站根目录为 `/www/example.com/public` 或 `D:/wwwroot/example.com/public`,这一步很多人搞错,需要配置到 `/public` 目录
### Apache错误诊断
**第一步,检测Apache是否支持mod_rewrite**
在 Apache 的配置目录(通常为`apache/conf/httpd.conf`)中找到 `rewrite_module` 相关配置。
- 如果未开启( 即 `#LoadModule rewrite_module` 前面有 `#` ),将前面的 `#` 号删除即可。
- 如果没有查找到,则到 `LoadModule` 区域,在最后一行加入 `LoadModule rewrite_module modules/mod_rewrite.so`。
完成以上操作后,重启Apache。
**第二步,让apache服务器支持.htaccess**
修改一下配置文件 `httpd.conf` ,用文本编辑器打开后,查找
```
Options FollowSymLinks
AllowOverride None
```
改为
```
Options FollowSymLinks
AllowOverride All
```
**第三步,检查网站的 `.htaccess` 文件是否正确**
部分软件配置时会覆盖 ModStart 默认的 `.htaccess` 文件,检查 `public/.htaccess` 文件是否为一下内容。
```
Options -MultiViews
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
```
## Q:忘记后台管理密码怎么办
系统中使用的是 md5 组合加密,如果忘记后台管理密码,请将表 `admin_user` 对应的用户记录密码信息重置为如下:
```
password: 3c20ecadec461ce77179008a44850334
passwordSalt: KUBg1mMi5I
```
对应的密码为:`123456`
## Q:500错误/请求出现错误
### 查找应用日志
“500错误”或“请求出现错误”通常是程序处理发生错误。
需要查看 `storage/logs/` 目录下的日志文件,找到当天最新的日志文件(如 `laravel-2021-01-01.log`),查看报错原因并解决。
错误日志需要定位到最新的错误日志,完整的一条错误日志通常如下格式所示,将该错误日志寻求其他开发者帮助(注意隐藏日志中的敏感信息)。
```
[2022-01-10 10:28:15] product.ERROR: xxx
Stack trace:
#0 xxx
#1 xxx
#2 xxx
#3 xxx
#4 xxx
#5 xxx
#x xxx
```
如果是发生在测试或开发环境,为了快速定位,可按照如下步骤排查
- 第1步,打开调试日志(设置 .env 文件中 APP_DEBUG=true)
- 第2步,直接访问页面查看错误信息,进行排查
如没有在系统目录找到记录的日志,请检查网站的目录权限是否正常,需要保证 PHP 的运行用户可以写入 `storage/logs/` 目录。
### 查找服务日志
应用日志没有记录的情况下,通常是由于致命错误导致进程异常结束,可能的原因有 内存溢出、底层库调用异常 等。
**Apache 环境**
Apache的错误日志因配置各异,通常情况下
- 宝塔环境:`/www/wwwlogs/`
- 其他环境:自行诊断
**Nginx 环境**
Nginx的错误日志因配置各异,通常情况下
- 宝塔环境:`/www/wwwlogs/`
- 其他环境:自行诊断
## Q:网站加载速度很慢
使用现代化浏览器(推荐 Chrome ),在页面右击,点击 `审查元素`,切换到 `Network` ,查看导致页面加载慢的请求。
- 如果是静态资源( js, css 等文件 )加载速度慢,需要考虑增加服务器带宽或者使用 CDN 等提高静态资源访问速度。
- 如果是服务器的接口请求慢,可能是由于服务器配置、数据库连接速度等原因导致,需要咨询专业技术人员进行分析处理。
![](https://ms-assets.modstart.com/data/image/2022/01/26/68498_dvjf_2408.jpg)
## Q:网站经过多层 Nginx 转发怎么配置
网站经过多层代理转发,通常在调用 `action` 方法生成 `URL` 时会出现异常。
这时可以通过在 .env 文件中设置如下两个配置来修正:
```
# 修正转发协议
FORCE_SCHEMA = http 或 https
# 修正用户访问URL
SUBDIR_URL = http://www.xxx.com
```
## Q:网站打不开,页面一直处于加载中
第一步,诊断是否为后端异常
参照 [500错误-请求出现错误](#q-500错误-请求出现错误) 找到后端报错日志。
第二步,诊断是否为前端异常
使用现代化浏览器(推荐 Chrome ),在页面右击,点击 `审查元素`,切换到 `Console` ,查看是否有任何报错。
## Q:迁移环境后出现访问500错误
出现类似如下错误
```
Failed opening required 'xxx/module/Vendor/Web/routes.php' **
Stack trace:
#0 {main}
```
系统在运行时为了提高性能会缓存部分文件路径,在新环境如果路径不一致会导致缓存文件加载失败。只需要清除缓存即可,步骤如下:
Tips:删除目录中的所有文件,注意不要删除目录本身,完成后重试
- 删除 `bootstrap/cache/` 中的所有文件
- 删除 `storage/framework/cache/` 中的所有文件
## Q:模块市场出现502请求错误
访问模块市场提示「请求出现错误」,同时接口 `后台/module_store/all` 返回502错误。
如果您的其他页面访问正常,通常还会看到 PHP-PMF 的错误日志
```
[error] 2874786#0: *8565 recv() failed (104: Connection reset by peer)
while reading response header from upstream ***
```
出现该错误,可能的原因有:
**(1)TCP/IP问题**
主要现象是在服务器完成下载内容之前连接被关闭,可能是网络问题,有可能导致的因素
- 最大传输单元问题
- 防火墙问题
- 未知网络问题
**(2)内核Bug**
请注意,在v2.6.17之后的一些Linux内核上,TCP窗口扩展存在一些问题,更多参考
- [https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331](https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331)
- [https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/89160](https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/89160)
**(3)PHP 的 CURL 扩展 Bug**
这些Bug可能是
- [https://bugs.php.net/bug.php?id=52828](https://bugs.php.net/bug.php?id=52828)
- [https://bugs.php.net/bug.php?id=52827](https://bugs.php.net/bug.php?id=52827)
- [https://bugs.php.net/bug.php?id=52202](https://bugs.php.net/bug.php?id=52202)
- [https://bugs.php.net/bug.php?id=50410](https://bugs.php.net/bug.php?id=50410)
我们曾经排查过几个类似问题,最终无果。该问题的影响因素较多,遇到该问题后,我们建议您更换 PHP 版本。
## Q:忘记后台用户或密码怎么办?
为了安全起见,系统不支持后台用户密码的找回。如果忘记后台管理密码,只需要使用专业数据库工具修改后台用户表 `admin_user` 即可。
修改对应的用户 `password` 和 `passwordSalt` 字段。
- `password`: `3c20ecadec461ce77179008a44850334`
- `passwordSalt`: `KUBg1mMi5I`
对应的登录密码为:`123456`
SQL参考
```sql
UPDATE admin_user
SET password='3c20ecadec461ce77179008a44850334',passwordSalt='KUBg1mMi5I'
WHERE username = '用户名';
```
## Q:忘记后台路径怎么办?
查看网站根目录中的 `.env` 文件,查看 `ADMIN_PATH` 变量。
```
# 表示后台路径为 http://www.example.com/admin_xxx/
ADMIN_PATH=/admin_xxx/
```
## Q:always\_populate\_raw\_post\_data 配置
找到 `php.ini` 文件,进行如下配置
> 配置前
![](https://mz-assets.tecmz.com/data//66.png)
> 配置后(取消注释,去掉分号)
![](https://mz-assets.tecmz.com/data//77.png)
> 配置完成后需重新 PHP 服务。
**宝塔环境**
如果是宝塔环境,请在 软件商店 → PHP → 设置 → 配置文件 查找 `always_populate_raw_post_data=-1` 去掉之前的分号 `;`,完成后操作 服务 → 重载配置。
![](https://ms-assets.modstart.com/data/image/2022/07/28/2577_tk7y_9457.png)
## Q:SSL certificate problem 错误
php在curl的时候报此错误:
```
cURL error 60: SSL certificate problem: unable to get local issuer certificate
(see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
```
解决办法:
1)从 https://curl.haxx.se/ca/cacert.pem 下载最新的cacert.pem
2)将以下行添加到php.ini(如果这是共享托管和您没有访问php.ini然后你可以添加到.user.ini在public_html)
```shell
curl.cainfo=cacert.pem路径
# 如 Windows 配置
curl.cainfo=c:\wwwroot\cacert.pem
# 如 Linux 配置
curl.cainfo=/etccacert.pem
```
## Q:如何关闭后台登录验证码
修改配置文件 `vendor/modstart/modstart/config/modstart.php`
```php
[
// ...
'login' => [
// 默认开启,修改为 false 表示关闭
'captcha' => true,
],
],
];
```
## Q:如何关闭后台的升级提醒和自动升级
修改配置文件 `vendor/modstart/modstart/config/modstart.php`
```php
[
// ...
// 禁用版本更新检查,默认为 false,修改为 true 表示禁用更新检查
'versionCheckDisable' => false,
// 禁用后台程序升级,默认为 false,修改为 true 表示禁用升级功能
'upgradeDisable' => false,
],
];
```
## Q:如何手动执行模块安装命令
模块安装、升级时都会自动执行 `modstart:module-install` 命令,如果出现安装升级模块后部分原因未执行迁移命令(或执行失败),请参考以下命令手动执行。
```shell
## 进入网站根目录
cd /wwwroot/xxx.com
## 手动执行模块安装命令,Xxx为模块标识
php artisan modstart:module-install Xxx
```
## Q:Ajax请求出现异常该如何排查或提问
第一步,修改 `.env` 文件,打开调试模式
```bash
# 配置调试模式未开启
APP_DEBUG=true
```
第二步,查看异常的请求信息(以 `Chrome` 浏览器为例)
在异常页面上右击,点击“检查”,网页底部弹出开发者工具。
点击 ① “网络” ② “全部”,点击 ③ 清空所有请求历史。
继续在页面上完成正常操作(比如提交动作),这时开发者工具会出现网络异常请求。
通过点击异常的网络请求,查看 Payload、Preview、Response 可以查看到请求数据和返回的错误信息。
在提问时候至少将上述的错误信息发送给其他小伙伴,别人才能帮你解答问题。
## Q:使用 MySQL 8.0 系统提示 Undefined property: stdClass::$column_name
ModStart 使用的 Laravel 5.1 框架默认不支持 MySQL 8.0 数据库,如果需要支持,请参考以下方法。
修改 `vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php` 文件,查找
```php
public function compileColumnExists()
{
return 'select column_name from information_schema.columns where table_schema = ? and table_name = ?';
}
```
修改为
```php
## `column_name` 改为 `column_name as `column_name`
public function compileColumnExists()
{
return 'select column_name as `column_name` from information_schema.columns where table_schema = ? and table_name = ?';
}
```
参考:[Specify lower case column_name (fixes #20190)](https://github.com/laravel/framework/pull/21037/commits/aaf81ecf2cbbe4cdb6a930750b585fe8053bfc7b)
## Q:如何在虚拟机上安装 ModStart
!!!郑重说明!!!:虚拟主机通常无法绑定运行目录到子目录,因此部署时会出现太多的安全隐患,配置比较繁琐,我们强烈不推荐!此方法只给技术爱好者作为测试参考,不再提供额外技术支持。
!!!重要的事!!!:在虚拟主机配置环境下,由于网站的所有数据都被暴露在浏览器访问路径下,因此要控制系统的系统文件不被访问到,当您配置好之后,至少要测试一下路径不能直接被用户下载,否则系统将会受到严重威胁。
- `http://www.example.com/.env`
- `http://www.example.com/storage/install.lock`
!!!其他说明!!!:使用中遇到问题可直接百度/Google搜索 `虚拟主机部署Laravel` 关键词自行解决。
使用虚拟主机安装前,请先下载环境的检测程序进行空间自荐,不满足要求的虚拟主机将不能安装。
- 环境检测脚本:[https://modstart.com/env_check.php.zip](http://modstart.com/env_check.php.zip)
如果您的虚拟主机根目录可以绑定到 `<网站目录>/public` 目录,请绑定到 `<网站目录>/public` 目录,随后执行 `/install.php` 安装向导。
如果您的虚拟主机根目录不支持绑定到 `<网站目录>/public`,需要按照如下配置:
1. 配置 Nginx 或 Apache 服务器,请将网站的根目录配置到 `<网站目录>`,其中 Nginx 和 Apache 配置需要参考如下所示;
**Nginx参考配置**
```nginx
server {
listen 80;
server_name www.example.com;
charset utf-8;
index index.php index.html;
root /var/www/html/www.example.com;
autoindex off;
location ^~ /.git {
deny all;
}
location ^~ /.env {
deny all;
}
location ^~ /storage/ {
deny all;
}
location / {
try_files /public$uri /public$uri/ /public/index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "open_basedir=/var/www/html/www.example.com/:/tmp/:/var/tmp/";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
```
**Apache参考配置**
httpd配置
```xml
ServerName www.example.com
DocumentRoot d:/wwwroot/example.com
```
在网站系统根目录增加 `.htaccess` 文件
```
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
```
**IIS参考配置**
`web.config` 配置
```xml
```
**一些已知特殊环境配置说明**
- 阿里云虚拟主机
- 需要开启PHP5.5版本;
- 由于阿里云禁用了putenv函数,这个函数尤为重要,所以需要打一个函数补丁,在程序最开始(public/index.php)的位置嵌入PHP代码,`putenv` 函数被禁用补丁代码如下
```php
function env($key, $defaultValue = null)
{
static $envFileConfig = null;
if (null === $envFileConfig) {
$envFileConfig = [];
$envFile = file_get_contents(__DIR__ . '/.env');
foreach (explode("\n", $envFile) as $line) {
$line = trim($line);
if (empty($line) || strpos($line, '#') === 0) {
continue;
}
list($k, $v) = explode('=', $line);
$envFileConfig[trim($key)] = trim($value);
}
}
if (array_key_exists($key, $envFileConfig)) {
return $envFileConfig[$key];
}
return $defaultValue;
}
```
## Q:系统并发和数据支撑能力
**经常遇到如下问题**
- 这个系统支不支持 ****W 的数据?
- 这个系统支不支持 *** 的并发?
- 我有 ****W 的数据,能不能支持,会不会卡?
**这里统一回复**
本系统已有过日均新增数据百万+、单表总量10亿+、集群节点50+的生产环境经验,不同阶段均有不同阶段的技术方案,所以上述问题简单的回答是与不是均不妥。
我们推荐不同阶段关注不同阶段的重点,早期以快为主,后期以稳为主。不同阶段我们我们可以提供弹性的技术方案。
我们会永远对技术保持敬畏之心。
其他还可参考 [《性能报告参考》](/manual/performance.html) [《系统运维优化参考》](/devops/basic.html) [《云端部署参考》](/devops/cloud.html) [《系统安全参考》](/devops/security.html)
## Q:open_basedir restriction in effect
提示如下错误
```
require(): open_basedir restriction in effect ***
```
`open_basedir` 设置是防跨站攻击的,出现这个错误需要进行如下设置。
**Nginx 参考处理**
在网站的 Nginx 配置增加
```nginx
server {
# ...
location ~ \.php$ {
# ...
# 需要设置到网站根目录 www.example.com
fastcgi_param PHP_VALUE "open_basedir=/var/www/html/www.example.com/:/tmp/:/var/tmp/";
# ...
}
# ...
}
```
**Apache 参考处理**
在 http.conf 文件内加上
```shell
# 需要设置到网站根目录
php_admin_value open_basedir E:/wwwroot/www.example.com
```
## Q:从数据库读取 Int 型全部变成了 String 型
安装并启用 `mysqlnd` 扩展