PHP老项目启动时,如何避免常见坑点?

摘要:记录一个老PHP项目中遇到的还能记得的坑,后面要是还有兴趣研究研究PHP的话,或者又有哪些坑,就都记一记,有些东西真的是不去整就不知道,改起来虽然不难,但是找起来却不容易啊。┗|`O′|┛ 嗷~~
php所有版本的地址: https://windows.php.net/downloads/releases/archives/ 访问控制器时省略了index.php报No input file specified. 解决:public/.htaccess下文件改为(RewriteRule行): <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] </IfModule> Apache开启路由重写(一般默认开启了): httpd.conf中mod_rewrite.so注释去掉。 阿里文件上传跨域 错误信息: Access to XMLHttpRequest at 'http://xxxx.oss-cn-hangzhou.aliyuncs.com/file?uploads=' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. require_once(): Failed opening required '../a.php' (include_path='.;C:\php\pear') 通过百度尝试以下,都没用: 1.可能由于你没有传完整php程序,或者php程序中的某个文件损坏,可能会报这个错误。去官网重新下载文件,是虚拟空间的请用官网支持的FTP工具上传php程序。 2.文件权限问题,可能文件或者文件夹权限设置错误引起的。 3.文件夹名含有中文,有时候中文文件夹名也可能引起这个错误,建议改成英文的。 4.修改php程序,这个方法我不推荐(因为有的php程序可能需要改很多很多) 5.修改php.ini配置文件。 通过测试,其在相同路径或者子路径是能生效的,也就是说它不识别../跳到上一个路径,那就直接使用路径常量定位到项目根路径,进行拼接,如: require_once THINK_PATH.'\Library\Vendor\aliyunOss\autoload.php'; Can't use method return value in write context 错误位置 FILE: xxx\WWW\app\ThinkPHP\Library\Vendor\aliyunOss\src\OSS\OssClient.php  LINE: 3384 这里是使用了阿里云OSS的phpsdk,目前的版本是(2.6.0 时间是:20221022),其文档上说支持PHP 5.3以上版本。 但很可惜那都是骗人的,然后换底版本的sdk(v2.2.4)。这个错就消失了。 Exception' with message '"xxxx.oss-cn-beijing.aliyuncs.com"bucket name is invalid' in 这是阿里云OSS的一个报错,这说明连上了呀。 这个是bucket名称错了,其值应该是这里的,(而不是像这种的xxx.oss-cn-beijing.aliyuncs.com): 关于文件上传 在php.ini中需要配置文件上传的最大值等,否则上传文件超出大小时$_FILES为空 ;post的最大值 默认的post_max_size 为2M post_max_size=1024M ;PHP页面运行的最大时间值,默认30秒 max_execution_time=300 ;上传的最大值 默认为8M post_max_size 大于 upload_max_filesize 为佳 upload_max_filesize=1024M ;是否允许通过HTTP上传文件的开关。默认为ON即是开 file_uploads = on ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_tmp_dir ;每个PHP页面接收数据所需的最大时间,默认60秒 max_input_time = 600 ;每个PHP页面所吃掉的最大内存,默认8M memory_limit = 8m 注:部署在Linux中的时候,要上传到的文件夹必须要有相关的权限。不然你在windows环境,啥都正常也传不上的。 ThinkPHP 验证码不显示 检查PHP是否已经安装GD库支持;将extension=php_gd2.dll的注释放开。 如果是中文验证码检查是否有拷贝字体文件到类库所在目录; ThinkPHP 验证码总是不正确 后台不能登入 使用new \Think\Verify();生成验证码会在session中保存验证码的值,但是若session的路径设置有问题,或者是没设置会导致其无法保存,进而一直都是空的导致出错。 ;配置session路径 session.save_path="D:\phpStudy\tmp\tmp" 当你配置了它发现还是不行的话,然后你切个低版本的它又行了,可能是当前项目目录下有类型user.ini也配置了session.save_path的值。你可以使用phpinfo();看下是不是有个local的量。 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' 改错误一般为pdo_mysql拓展未开启,在php.ini中将extension=pdo_mysql的注释放开即可。 还不行,则可在phpinfo中检测拓展的目录是否设置正确,和改目录下是否有该拓展。 STORAGE_WRITE_ERROR:./../cache/Cache/Home/e1abadd62c4e87a9a75c0e547ca055ed.php cache文件夹没有写入的权限,导致缓存无法写入。此问题很容易在使用widnows开发,然后部署到linux中时,有不少问题就是权限没给导致的。 解决:权限设置成777或者nginx(apache)所在的组和用户。 Fatal error: Uncaught Error: Call to undefined function Think\C() in Library\Think\Think.... 可以在app\ThinkPHP\Library\Think\Think.class.php直接看TP的源码: 在start方法中有: 点击查看代码 /** * 应用程序初始化 * @access public * @return void */ static public function start() { ...... // 这里可以看到 它取了~runtime.php文件 $runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php'; if(!APP_DEBUG && Storage::has($runtimefile)){ Storage::load($runtimefile); }else{ if(Storage::has($runtimefile)) Storage::unlink($runtimefile); $content = ''; // 读取应用模式 $mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php'; // 加载核心文件 foreach ($mode['core'] as $file){ if(is_file($file)) { include $file; if(!APP_DEBUG) $content .= compile($file); } } ..... if(!APP_DEBUG){ $content .= "\nnamespace { Think\\Think::addMap(".var_export(self::$_map,true).");"; $content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}'; Storage::put($runtimefile,strip_whitespace('<?php '.$content)); }else{ // 调试模式加载系统默认的配置文件 C(include THINK_PATH.'Conf/debug.php'); // 读取应用调试配置文件 if(is_file(CONF_PATH.'debug'.CONF_EXT)) C(include CONF_PATH.'debug'.CONF_EXT); } } .... // 运行应用 App::run(); } 如果不成立引入正常文件,并 重新生成common~runtime.php编译文件,所以这错的时候就可尝试删除掉~runtime.php文件,让它重新生成,看能不能引入。 若还不能可参考看看:https://blog.csdn.net/matthis_meng/article/details/120286461 关于缓存common~runtime.php 有时发先有些错,咋找都没问题,可能删下这个缓存就好了。 Data truncated for column ‘字段名‘ at row 1 修改的字段不为空,如已经设定为枚举。 更新字段长度超出表限制的长度。 更新的字段类型与表中的类型不匹配。 具体参考:https://blog.csdn.net/qq_43070236/article/details/126197875 “include_path='.;c:\php5\pear'”错误 在php.ini中可配置include_path来达到在任何文件中都可以直接引入该目录下文件 include_path = '.;c:\php5\pear' 给定有路径/目录(相对路径或绝对路径),则按照给定路径查找文件,include_path设置将被完全忽略。 未给定路径/目录(相对路径或绝对路径),则按照include_path指定目录寻找->脚本所在目录和当前目录下寻找 未找到,include发出一条警告,require发出一个致命错误。 具体可参考:https://www.cnblogs.com/wanghaokun/p/10184491.html 页面错误!请稍后再试~ 相关配置 未开启调试模式 没有开启调试的模式的时候相关的配置,可以在app\ThinkPHP\Conf\convention.php进行配置。 开启调试模式 public/index.php // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG', false); 开启调试模式后,更多的配置可以在app\ThinkPHP\Conf\debug.php进行配置。 常用配置项: 'TMPL_CACHE_ON' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译 'TMPL_CACHE_TIME' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒) 'SHOW_ERROR_MSG' => false, // 显示错误信息