PHP笔记-环境配置和常见问题处理

目录

一、PHP5.6连接mysql5.6正常mysql8.0报错

二、Apache 配置多个php切换

三、Apache开启gzip

四、php调试模式配置(PhpStorm)

五、Primary script unknown 错误

六、It is not safe to rely on the system's timezone settings 错误

七、ThinkPHP多数据源配置

八、docker php-fpm优化

 九、ThinkPHP 调试

十、ThinkPHP常见漏洞

十一、设置最大表单提交限制

十二、ThinkPHP打印日志

十三、PHPExcel问题

十四、xdebug Debug session was finished without being paused

十五、dwt文件

十六、常用语法

十七、EcShop遇到问题

十八、phpqrcode 生成图片显示出错


一、PHP5.6连接mysql5.6正常mysql8.0报错

        1:错误
            SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
        2:修改
            修改mysql配置文件(ProgramData\MySQL\MySQL Server 8.0\my.ini)指定配置项
            character-set-server = utf8mb4
            collation-server = utf8mb4_unicode_ci
            #MySQL8中用户的认证类型(Authentication type)默认为cacheing sha2 password
            default_authentication_plugin=mysql_native_password
        3:重启mysql

二、Apache 配置多个php切换

        方式一:
        1:下载5和7版本的PHP
            下载对应版本的php(php-Win32-VC):windows.php.net - /downloads/releases/archives/
        2:解压下载的文件到指定目录
        3:修改配置
            拷贝文件夹下的 php.ini-developement 文件改名为php.ini然后编辑
            extension_dir = "php5/ext"
            date.timezone = Asia/Shanghai
        4:开启一些php扩展文件(bz2;curl;fileinfo;gd2;gettext;mysqli;pdo_mysql;mbstring;shmop)
            windowns:把对应的扩展前面的注释去掉(win10 64下 php7:curl开启后需要将对应版本的php目录下的libssh2.dll文件拷贝到Apache24\bin中否则不起作用;php5:需要拷贝libssh2.dll libeay32.dll ssleay32.dll)
            docker方式进入容器后使用 docker-php-ext-install -j$(nproc) mysqli
            官方支持的扩展(通过php -m可查看现有扩展):(bcmath, calendar, exif, gettext, sockets, dba,mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm)
            bz2 扩展的安装, 读写 bzip2(.bz2)压缩文件
              apt-get update
              apt-get install -y --no-install-recommends libbz2-dev
              rm -r /var/lib/apt/lists/* && \
              docker-php-ext-install -j$(nproc) bz2
           gd 扩展的安装. 图像处理
              $ apt update && \
              apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev && docker-php-source extract && \
              rm -r /var/lib/apt/lists/* && \
              docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-webp-dir=/usr/include/webp/ --with-png-dir=/usr/include/ && \
              docker-php-ext-install -j$(nproc) gd
              php7报错需要修改命令:docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ --with-webp=/usr/include/webp/
          zip 扩展的安装
              $ apt-get update && \
              apt-get install -y --no-install-recommends libzip-dev && \
              rm -r /var/lib/apt/lists/* && \
              docker-php-ext-install -j$(nproc) zip
          redis 扩展安装
              下载对应版本的扩展 注意版本一定要和php版本对应否则按照不成功:
                  igbinary  windows.php.net - /downloads/pecl/releases/igbinary/
                  redis windows.php.net - /downloads/pecl/releases/redis/
          解压下载的扩展分别把 php_igbinary.dll和php_redis.dll拷贝到php安装目录下的ext文件夹中
               修改php.ini:
                   添加 extension=php_igbinary.dll和extension=php_redis.dll
               重启
          sqlserver drivers:
              Windows:
                 1:下载对应版本的压缩包
                 2:解压文件到ext目录
                 3:修改php.ini
                       添加 extension=php_sqlsrv_74_ts.dll和extension=php_pdo_sqlsrv_74_ts.dll
                 4:下载安装对应版本的ODBC
             docker方式:
                 1:进入容器
                 2:安装odbc 参考 参考官网如果php docker镜像是php-fpm对应文档的 Debian 系统,如果是php-fpm-alpine对应Alpine Linux系统
                       问题:apt-get update 报NO_PUBKEY时执行(apt-key adv --recv-keys --keyserver keyserver.ubuntu.com <错误里的key>)并根据错误安装依赖
                 3:安装php扩展 参考 参考官网如果php docker镜像是php-fpm对应文档的 Alpine 系统,如果是php-fpm-alpine对应 Alpine 系统
                 还可以通过docker-php-ext-install安装
                 docker-php-source extract # 创建并初始化 /usr/src/php目录
                 cd /tmp
                 curl -L -o /tmp/pdo_sqlsrc.tgz  https://pecl.php.net/get/pdo_sqlsrv-5.9.0.tgz
                 curl -L -o /tmp/sqlsrc.tgz  https://pecl.php.net/get/sqlsrv-5.9.0.tgz
                 tar zxvf pdo_sqlsrv-5.9.0.tgz
                 tar zxvf sqlsrv-5.9.0.tgz
                 mv pdo_sqlsrv-5.9.0  /usr/src/php/ext/pdo_sqlsrv
                 mv sqlsrv-5.9.0  /usr/src/php/ext/sqlsrv
                 docker-php-ext-install pdo_sqlsrv
                 docker-php-ext-install sqlsrv
                 4:php -m 查看安装是否成功
                 5:退出容器并重启
                 6:sqlserver 通过odbc连接mysql
                      下载unixODBC -> cd /opt -> tar -zxvf unixODBC-2.3.9.tar.gz -> cd unixODBC-2.3.9 -> ./configure -> make -> make install -> odbcinst –j查看
                      下载对应版本mysql Connector/ODBC安装包 -> dpkg -i xxx.deb -> odbcinst -q -d查看是否安装成功 ->  vi /etc/odbc.ini
                           [mysql]
                           Description     = Data source sampleMySQL for accessing MySQL database sampleMySQL
                           Driver          = MySQL ODBC 8.0 Unicode Driver
                           Server          = <ip>
                           Host            = <ip>
                           Database        = <name>
                           Port            = 3306
                           User            = <user>
                           Password        = <pwd>
                       -> isql -v mysql连接成功
          其他扩展安装方法参考 https://blog.csdn.net/lggirls/article/details/89395827 
        5:在文件夹下运行cmd 输入php.exe -v 如果正常输出表示php好使
             5版本运行php.exe -v报错可能需要安装VC11运行环境,官网下载地址如下:
               VC9-32 http://www.microsoft.com/zh-CN/download/details.aspx?id=5582 
               VC9-64 http://www.microsoft.com/zh-CN/download/details.aspx?id=15336 
               VC11-32 https://www.microsoft.com/zh-CN/download/details.aspx?id=30679 
               VC14-32  https://www.microsoft.com/en-us/download/details.aspx?id=48145 
        6:修改Apache配置文件 httpd.conf
              添加LoadModule切换时每次打开一个
             #LoadModule php7_module "/php7/php7apache2_4.dll"
             LoadModule php5_module "/php5/php5apache2_4.dll"
             #<IfModule php7_module>
             #    AddHandler application/x-httpd-php .php
             #    AddType application/x-httpd-php .php .html
             #    PHPIniDir "D:/Program Files (x86)/php7/php.ini"
             #</IfModule>
            <IfModule php5_module>
              DirectoryIndex index.html index.php
              AddHandler application/x-httpd-php .php
              PHPIniDir "D:/Program Files (x86)/php5/php.ini"
           </IfModule>
        7:新建文件phpinfo.php到apache的htdocs目录;内容为<?php phpinfo();?>
              访问phpinfo.ph输出对应版本信息说明切换php版本正常
        8:win10 64下php7:curl开启后需要将对应版本的php目录下的libssh2.dll文件拷贝到Apache24\bin中否则不起作用;php5:需要拷贝libssh2.dll libeay32.dll ssleay32.dll
        方式二:
        1:开启Apache的vhost模式
             编辑httpd.conf
               打开LoadModule vhost_alias_module modules/mod_vhost_alias.so
               打开Include conf/extra/httpd-vhosts.conf
               打开LoadModule access_compat_module modules/mod_access_compat.so
             编辑httpd-vhosts.conf
               添加一个vhost如下,然后重启apache访问ServerName

<VirtualHost *:80>
	DocumentRoot "${SRVROOT}/htdocs"
        DirectoryIndex index.htm index.html index.php
	ServerName www.xxx.com
        ServerAlias xxx.com
        ErrorLog "logs/xxx-error.log"
        CustomLog "logs/xxx-access.log" common
	<Directory "${SRVROOT}/htdocs">
            Options Indexes FollowSymLinks
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
	</Directory>
</VirtualHost>

        2:开启vhosts后就可以配置不同项目用不同的php了
            安装mod_fcgid模块,到apache官网下载对应版本的mod_fcgid模块 地址 
            下载后解压找到readme文件按照步骤修改配置
                1:拷贝mod_fcgid.so文件到Apache24/modules/mod_fcgid.so
                2:拷贝httpd-fcgid.conf文件到Apache24/conf/extra/httpd-fcgid.conf
                3:修改httpd-fcgid.conf

<IfModule fcgid_module>
# Fast CGI module Settings (PHP 5.3, 5.4)
	#FcgidInitialEnv PHPRC "D:\\php5"
	#FcgidInitialEnv PATH "D:\\php5;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;"
        #上面两项适用统一php版本,否则到vhosts中配置在不同项目中
	FcgidInitialEnv SystemRoot "C:\\Windows"
	FcgidInitialEnv SystemDrive "C:"
	FcgidInitialEnv TEMP "C:\\WINDOWS\\TEMP"
	FcgidInitialEnv TMP "C:\\WINDOWS\\TEMP"
	FcgidInitialEnv windir "C:\\WINDOWS"
	#设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程 在处理完所有请求前退出
	FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Global mod_fcgid settings

	#40最大执行时间
	FcgidIOTimeout 300
	#10最大空闲时间
	FcgidConnectTimeout 300
	#8php-cgi最大的进程数
	FcgidMaxProcesses 1000
	FcgidOutputBufferSize 64
	ProcessLifeTime 240
	#500php-cgi每个进程的最大请求数
	FcgidMaxRequestsPerProcess 1000
	FcgidMinProcessesPerClass 0
	#限制最大请求字节
	FcgidMaxRequestLen 2097152
	#php程序最大文件上传限制50MBfastcgi模式下默认上传文件大小只有131072字节128kb,在php.ini中修改upload_max_filesize等参数无效
	MaxRequestLen 52428800
# Global Config Example
# Comment out next 4 lines to use per-Directory or per-VirtualHost configuration
  <Files ~ "\.php$">
    # 此处配置为全局配置会覆盖vhost中的配置导致vhost中配置无效
    #Options ExecCGI
	#映射fcgi执行脚本
    #AddHandler fcgid-script .php
	#php-cgi脚本执行路径
    #FcgidWrapper "D:/ProgramFiles/php5/php-cgi.exe" .php
    #上面3项适用统一php版本,否则到vhosts中配置在不同项目中
  </Files>
</IfModule>

                4:拷贝mod_fcgid.html文件到Apache24/manual/mod/mod_fcgid.html 
                5:修改httpd.conf
                      LoadModule fcgid_module modules/mod_fcgid.so
                      Include conf/extra/httpd-fcgid.conf
                6:修改conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
	DocumentRoot "${SRVROOT}/htdocs"
        DirectoryIndex index.htm index.html index.php
	ServerName www.xxx.com
        ServerAlias xxx.com
        ErrorLog "logs/xxx-error.log"
        CustomLog "logs/xxx-access.log" common

	FcgidInitialEnv PHPRC "D:\\php7"
	FcgidInitialEnv PATH "D:\\php7;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;"
	AddHandler fcgid-script .php
        # 此处路径不能包含空格否则无法启动
	FcgidWrapper "D:/php7/php-cgi.exe" .php
	<Directory "${SRVROOT}/htdocs">
            Options Indexes FollowSymLinks ExecCGI
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
	</Directory>
</VirtualHost>

                Options相关配置参考:pache配置Options详解_bit小兵的博客-CSDN博客 
                7:.htaccess 的重定向配置
                       以前是这样用的RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]会出现错误,无法重定向到 index.php   No input file specified.
                       修改成RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]就好了
                8:apache使用mod_fcgid模块后,php_admin_value open_basedir 参数就不起作用了,防止php脚本跨站必须去php.ini配置文件中设置。
                       [HOST=www.xxx.com]
                       [PATH=/wwwroot/]
                       open_basedir=/wwwroot/:/tmp/
                9:重启Apache

三、Apache开启gzip

        1:修改apache的httpd.conf文件
             开启deflate_module和headers_module模块
             添加如下代码
            <IfModule mod_deflate.c>
              # 告诉 apache 对传输到浏览器的内容进行压缩
              SetOutputFilter DEFLATE
              # 压缩等级 9 最低是1,不建议按最大级别进行压缩,压缩率过高会占更多CPU资源
              DeflateCompressionLevel 9
              # 设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
              SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
              # AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
              # AddOutputFilter DEFLATE js css
           </IfModule>
        2:验证是否开启
             在浏览器调试模式下的network中查看请求的Content-Encoding  可以通过右键Name Status标题栏选择Response Headers选择显示
             如果Content-Encoding列中显示gzip说明配置成功

四、php调试模式配置(PhpStorm)

        1:下载Xdebug
              选择和php版本对应的版本下载 Xdebug: Historical Releases 
              或者通过Xdebug自动匹配页面下载 Xdebug: Support — Tailored Installation Instructions 
              将下载的dll文件拷贝到php目录 php/ext 下
        2:修改php/php.ini添加如下内容:
            [Xdebug]
            zend_extension="/php5/ext/php_xdebug.dll"
            ;允许远程IDE调试
            xdebug.remote_enable=on
            ;远程IDE所在HOST和PORT
            xdebug.remote_host=localhost
            xdebug.remote_port=9000
            xdebug.remote_handler=dbgp
            ;开启远程调试自动启动
            xdebug.remote_autostart = Off
            ;可以是任意Key,这里设定为PHPSTORM
            xdebug.idekey = "PHPSTORM"
            ;开启自动跟踪
            xdebug.auto_trace = On
            xdebug.trace_output_dir="/Apache/Xdebug"
            ;把执行情况的分析文件写入到指定目录中
            xdebug.profiler_enable=on
            xdebug.profiler_output_dir="/Apache/Xdebug"
        3:重启apache
        4:idea 配置Xdebug
          【File】->【Settings】->【Languages & Frameworks】->【Servers】添加一个server

        配置Deployment:如果项目在apache中则不需要此配置,如果项目不在apache需要通过配置这个来上传代码到apache中。此项配置也可以用来远程调试

        最后配置一个PHP Web Page服务       

        最后点击debug图标启动调试即可

       

五、Primary script unknown 错误

    在所有环境都成功部署好后,有的在运行应用时,会出现"Primary script unknown"错误,一般这是由于nginx和php-fpm的用户不同导致的。把nginx.conf和php-fpm.d/www.conf 的user设为同一个就可以了。
    修改web目录的权限:chown www-data:www-data web目录 -R       chmod 755 web目录 -R

六、It is not safe to rely on the system's timezone settings 错误

    1:在页头使用date_default_timezone_set()设置 date_default_timezone_set('PRC'); //东八时区 echo date('Y-m-d H:i:s');
    2:在页头使用 ini_set('date.timezone','PRC');或ini_set('date.timezone','Asia/Shanghai');
    3:修改 php.ini的date.timezone去掉前面的分号修改为date.timezone = "Asia/Shanghai" (Asia/Shanghai和PRC都可以)
    4:重启

七、ThinkPHP多数据源配置

    1:配置database.php
          在默认数据库后面添加 'db2'   => ['type'=>'sqlsrv','hostname'=> '127.0.0.1','database'=> '******','username'=> 'sa','password'=> 'root','hostport'=> '1433','prefix'=> '',],
    3:使用
         Db::connect('db2') -> name('xx') -> where([['xxx','=','0101001']]) -> limit(0, 10) -> select();// prefix生效
         Db::connect('db2') -> table('xx') -> where([['xxx','=','0101001']]) -> limit(0, 10) -> select();// prefix不生效

八、docker php-fpm优化

    修配置文件 /usr/local/etc/php-fpm.d/www.conf
    pm=dynamic 设置为static,系统会开启设置的数量个php-fpm进程;设置为dynamic,系统会在php-fpm运行开始时启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
    pm.max_children=30 最大进程数量
    pm.start_servers=10  动态方式下的起始进程数量。
    pm.min_spare_servers=10 动态方式空闲状态下的最小进程数量。
    pm.max_spare_servers=24 动态方式空闲状态下的最大进程数量
    pm.max_requests=500 所有子进程重启时间为300s一次,并发量为50,max_children设置为30,max_requests = 300*50/30=500,如果想让进程每隔一小时重生一次,则是3600*50/30=6000。如果pm.max_requests没有设置重启参数,默认为不限制最大服务次数,也就是子进程永远不重启,长时间不重启子进程会导致系统负载异常,处理时间变长等现象。
    重启服务

 九、ThinkPHP 调试

    echo Debug::getUseTime(); // 统计从开始到统计时的时间
    echo Debug::getUseMem(); // 统计从开始到统计时的内存使用情况
    dump(Debug::getFile(true)); // 获取文件加载信息
    echo User::getLastSql(); (new User())->fetchSQL(true)->find(); // 打印sql语句

十、ThinkPHP常见漏洞

    1、控制器漏洞:修改library/think/App.php
        // 获取控制器名
        $controller = strip_tags($result[1] ?: $config['default_controller']);
        // 添加
        if (!preg_match('/^[A-Za-z](\w)*$/', $controller)) { throw new HttpException(404,'controller not exists' . $controller); }

十一、设置最大表单提交限制

    出现这个问题是因为之前用id拼接的方式传参数,后期因为数据量增大导致报错
    修改php.ini中的max_input_vars默认是1000

十二、ThinkPHP打印日志

    可以通过Log::info('xxxx')的方式来记录日志

十三、PHPExcel问题

    1:Warning: ZipArchive::getFromName(): Invalid or unitialized Zip object 版本问题解决方法
        $objReader = PHPExcel_IOFactory::createReader('Excel2007');
        if(!$objReader->canRead($file)){$objReader = PHPExcel_IOFactory::createReader('Excel5');}
        $objPHPExcel = $objReader->load($file,$encode='utf-8');
    2:phpExcel导出,在本地正常,在服务器乱码
        ob_end_clean();  // header之前先清除缓存区的内容
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$fileName.'.xls"');
        header('Cache-Control: max-age=0');

十四、xdebug Debug session was finished without being paused

    请求域名要和PHPStorm中的debug servers配置的域名相同

十五、dwt文件

    PHP中的一种模板文件PHPStorm要支持打开需要配置一下settings->File Types->Smarty->添加*.dwt

十六、常用语法

    $arr = Array('0','1','2','3','4');echo count($arr);

十七、EcShop遇到问题

    1:Deprecated: preg_replace()报错
        return preg_replace("/{([^\}\{]*)}/e", "\$this->select('\\1');", $source);改为
        return preg_replace_callback("/{([^\}\{]*)}/", function($r) { return $this->select($r[1]); }, $source);
    2:EcShop使用Smarty模板
    3:Parse error: syntax error 指的是语法错误
        需开启短标签支持,打开php.ini文件,搜索 short_open_tag = Off  他默认的就是关闭的  ,将他改为On,然后重启apache就可以了
    4:在5.3版本之后已经不允许在程序中使用”=&”符号。如果你的网站出现了Deprecated: Assigning the return value of new by reference is deprecated in 错误,别着急,先定位到出错的文件,查找下是不是在程序中使用了”=&”,例如刚才定位到网站程序中发现了下图的程序,发现使用了”=&”符号,去掉‘&’符号之后程序运行正常
    5:Declaration of phpbb::set_cookie() should be compatible with integrate::set_cookie...解决办法:把function set_cookie ($username="") 改为function set_cookie ($username="", $remember = NULL)
    6:Strict standards: Non-static method cls_sql_dump::get_random_name() should not be called statically把 cls_sql_dump的 function __construct()改到 function cls_sql_dump()的前面把cls_sql_dump的 function get_random_name()改成 static function get_random_name()
    7:Strict Standards: Redefining already defined constructor for class alipay in有两种构造函数,一种是跟类同名的函数,一种是 __contruct()。从PHP5.4开始,对这两个函数出现的顺序做了最严格的定义,必须是 __construct() 在前,同名函数在后
    8:Strict Standards: mktime()把 mktime() 改成 time()
    9:Strict Standards: Non-static method cls_image::gd_version() should not be called staticallyfunction gd_version 改成 static function gd_version
    10:Strict Standards: Only variables should be passed by reference in找到提示错误的文件 cls_template.php 及行号把 $tag_sel = array_shift(explode(' ', $tag));改成:$tag_arr = explode(' ', $tag);$tag_sel = array_shift($tag_arr);并且删除 D:\wamp\www\ecshop\temp\caches下所有的文件
    11:数据字典 ecshop数据字典_shooke的博客-CSDN博客

十八、phpqrcode 生成图片显示出错

    <?php   
    header('Content-Type: image/png'); // 添加
    include('phpqrcode.php');  //引入phpqrcode库文件 
    $picUrl = 'www.baidu.com'; //二维码扫描出的链接 
    ob_clean();  // 添加
    QRcode::png($picUrl,false(是否生成文件),'L',4); 

十九、Apache ab并发压测

    apache自带压测工具可用进行压力测试
    \bin\ab -n 800 -c 800 url (-n发出800个请求,-c模拟800并发,相当800人同时访问,后面是测试url)
    \bin\ab -t 60 -c 100 url (在60秒内发请求,一次100个请求)
    \bin\ab -t 60 -c 100 -T "text/plain" -p p.txt url p.txt 是和ab.exe在一个目录p.txt 中可以写参数,如  p=wdp&fq=78

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值