分类 PHP 下的文章

Window下的PHP命令行工具

本章介绍基于Windows PowerShell下 PHP命令行技巧

PowerShell

PowerShell(包括Windows PowerShell and PowerShell Core)是微软公司开发的任务自动化和配置管理框架,由.NET Framework.NET Core是构建的命令行界面壳层相关脚本语言组成,最初仅Windows组件,后于2016年8月18日开源跨平台支持

UNIX系统一直有着功能强大的壳程序(shell),Windows PowerShell的诞生就是要提供功能相当于UNIX系统的命令行壳程序(例如:shbashcsh),同时也内置脚本语言以及辅助脚本程序的工具。

定义命令别名

查看别名
  • 查看此Session中已经设定的所有别名:Get-Aliasgal

PS C:\> gal
  • 查看某别名的原命令,如ls的原命令:> Get-Alias ls

  • 查看某原命令的别名,如Get-ChildItem的别名:> Get-Alias -Definition Get-ChildItem

创建别名

​ 创建别名有两个方法可用New-AliasSet-Alias ;其中New-Alias 可以创建别名,但是不能更改;Set-Alias 可以创建或更改别名。

​ 注意:通过命令创建的别名只能在当前回话中生效,关闭回话窗口后回自动失效;创建永久别名需要在后面有详细介绍。

给记事本创建一个别名,并运行:

C:\PS> Set-Alias Edit notepad
C:\PS> Edit //打开记事本

//电脑中notepad++的程序路径为 E:\Program Files (x86)\Notepad++\notepad++.exe
C:\PS> Set-Alias Edit "E:\Program Files (x86)\Notepad++\notepad++.exe"
C:\PS> Edit //打开Notepad++程序
删除别名

​ 别名不用删除,自定义的别名在powershell退出时会自动清除。但是请放心,powershell内置别名(诸如ls,dir,fl等)不会清除。如果你非得手工删除别名。请使用

PS C:\PS> del alias:Edit
创建永久的别名

​ 在PowerShell中直接使用Set-AliasNew-Alias命令创建的别名在关闭此Session后即会失效,防止此现象的方法是将此命令写入Windows PowerShell profile文件。

​ 查看此文件在计算机中的位置:

PS C:\> $profile //实际上显示的路径文件不存在

​ 一般该文件在没有创建前是不存在的,使用以下命令为当前用户创建profile命令并返回文件地址:

PS C:\> New-Item -Type file -Force $profile //执行该命令回创建相应的文件,

​ 注意:首次在计算机上启动 Windows PowerShell 时,现用执行策略很可能是 Restricted(默认设置)。Restricted 策略不允许任何脚本运行。请在PowerShell中执行如下命令:

set-ExecutionPolicy RemoteSigned 
// 执行策略更改提示
// 执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies 帮助主题中所述的安全风险。是否要更改执行策略? [Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): y 
// 修改后即可执行脚本。

PowerShell脚本四种执行权限:

Restricted——默认的设置, 不允许任何script运行

AllSigned——只能运行经过数字证书签名的script

RemoteSigned——运行本地的script不需要数字签名,但是运行从网络上下载的script就必须要有数字签名

Unrestricted——允许所有的script运行

若要了解计算机上的现用执行策略,请键入:get-executionpolicy

设置常用永久命令:

打开生成的profile文件:C:\Users\geek100\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Set-Alias Edit "E:\Program Files (x86)\Notepad++\notepad++.exe"
Set-Alias php56 "E:\phpStudy\PHPTutorial\php\php-5.6.27-nts\php.exe"
Set-Alias php72 "E:\phpStudy\PHPTutorial\php\php-7.2.1-nts\php.exe"
Set-Alias mysql "E:\phpStudy\PHPTutorial\MySQL\bin\mysql.exe"
Set-Alias mysql "E:\phpStudy\PHPTutorial\MySQL\bin\mysql.exe"
Set-Alias mysqldump "E:\phpStudy\PHPTutorial\MySQL\bin\mysqldump.exe"

重启PowerShell,在命令窗口中执行如下命令体验下效果吧:

PS C:\Users\geek100\Documents> Edit    //打开编辑器
PS C:\Users\geek100\Documents> mysql -h'127.0.0.1' -uroot -p //打开MySQL终端
PS C:\Users\geek100\Documents> mysqldump -h'127.0.0.1' -uroot -p test > test.sql //导出
PS C:\Users\geek100\Documents> php72 -i //查看phpinfo信息
PS C:\Users\geek100\Documents> php72 -v    //查看php版本信息

PHP命令行

一下是PHP官网相关一些介绍,具体介绍请查看《PHP命令行模式

从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。顾名思义,该 CLI SAPI 模块主要用作 PHP 的开发外壳应用。CLI SAPI 和其它 CLI SAPI 模块相比有很多的不同之处,我们将在本章中详细阐述。值得一提的是,CLI和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行为;

CentOS6.5安装为PHP安装memcached扩展

PHP环境版本

CentOS6.5的PHP版本为5.6.21通过yum方式安装的, memcache扩展已经通过yum 方式安装好了

首先需要下载并安装libmemcached

因为memcached扩展是基于libevent的事件处理的, 首先需要安装libmemcached
下载地址
解压并安装:

tar zxf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached//注意:--with-memcached这个选项一定要加上
make
make install

注意:如果需要适用sasl, 也可以在安装libmemcahced前安装cyrus-sasl-devel:

yum install cyrus-sasl-devel

安装memcached扩展

首先下载memcached扩展, 下载地址
解压并安装:

tar zxf memcached-2.2.0.tgz
cd zxf memcached-2.2.0
phpize
./configure --with-php-config=/usr/bin/php-config --disable-memcached-sasl --with-libmemcached-dir=/usr/local/libmemcached
make
make test
make install

注意:如果不使用--disable-memcached-sasl安装过程中会提示

error 'configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check '

至此php的memcached扩展安装完毕, 重启php-fpm 即可生效。

关于PHP cURL:SSL certificate error: unable to get local issuer certificate 问题

Window下PHP调用curl接口访问https网址时报错:

<blockquote>

SSL certificate error: unable to get local issuer certificate


</blockquote>

尝试关闭SSL_VERIFY验证,也可以解决问题,但是强烈不建议用该方法:

<blockquote>

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);


</blockquote>

最好的解决办法是添加certificate认证文件并修改PHP.ini配置

认证文件下载地址:https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt|417f571a690912722a28e4bf5ebb723211|

php.ini 修改如下:

<blockquote>

curl.cainfo="C:/wamp/ca-bundle.crt"
openssl.cafile="C:/wamp/ca-bundle.crt"


</blockquote>

问题彻底解决

关于PHP的Memcache扩展get方法返回数据格式为serialize的问题

问题描述

这两天网站页面中城市名称显示的地方不正常,但是有些地方也正常。调用城市代码用了Memcache缓存,扩展是Memcache。 经过调试后发现调用城市数据的时候有些城市数据返回的是:

string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"
string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"

这个问题是memcache->get返回的数据没有经过unserialize处理,就直接返回了,所以导致页面中$array['key']调用的时候显示异常。

目前仍旧无法分析出来具体原因, 先记录下来以后再分析。目前可以确定如下情况:

  • 最近没有升级过服务器和相关服务;
  • 缓存设置的地方是正常的;
  • 只有部分城市出现过问题;
  • 重启过memcached服务, 并不解决问题;
  • PHP版本5.4.45

LNMP服务器安全指南

平时工作中需要维护一些Linux服务器, 有时候也需要自己配置下服务器, 一般主要是配置LNMP服务。整理了一些服务器安装配置方面的知识,现在就总结下。

  • Linux最低权限安全配置
    Nginx、MySQL、PHP-FPM三者都应该是以最低权限用户组运行。
    网站目录的文件用户组和PHP运行用户属主应该区分开, 设置PHP对网站文件只有可执行权限, 对于静态文件都交给Nginx处理。比如PHP-FPM的用户组为php-fpm:php-fpm, 网站目录www.lezhizhe.net其用户组为www:www, 文件属性为644,也就是说php合nginx在网站根目录只有读权限。对于文件上传目录和缓存目录, 可以设置777权限, 生成的文件要设置为644属性, 禁止上传的文件具有可执行权限。
    对于PHP使用open_basedir限制虚拟主机跨目录访问(网上有说在php.ini文件中修改open_basedir, 经测试不生效)。不过可以在nginx的每个站点的con.f文件中设置PHP的open_basedir属性(注意如果在某个站点设置了该属性其它站点未设置, 会造成其它站点打不开的情况):
fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/";
  • Linux防火墙及端口配置
    1、禁止SSH密码登陆方式, 采用公钥方式登陆。
    2、开启iptables。只开放必要的端口出来。iptable配置如下:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [46:7024]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT //DNS端口
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT //HTTP端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4000 -j ACCEPT //FTP端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4355 -j ACCEPT //SSh端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 30000:60000 -j ACCEPT //FTP被动模式端口
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  • PHP安装配置
    1.禁用不安全PHP函数
    disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo
    2.关闭错误日志防止输出错误信息, 记录log方便程序调试
    display_errors = Off
    log_errors=On
    error_log=/var/log/php-fpm/sie-error.log

    3.关闭远程代码执行。如果启用,PHP可以通过allow_url_fopen,在file_get_contents()、include、require中获取诸如FTP或网页内容这些远程数据。如果忘记了对输入数据进行过滤,而这些函数调用了这些数据,则形成了注入漏洞。
    allow_url_fopen=Off

    4.防止PHP信息泄露, 不轻易透露自己php版本信息,防止黑客针对这个版本的php发动攻击.
    expose_php = Off

    5.禁止动态加载链接库:
    enable_dl = Off

    6.将文件上传到远程服务器, 例如nfs等。当然也可以调用你们写好的php接口。 即使有上传漏洞,那么文件也被传到了静态服务器上。木马等文件根本无法执行。

  • Nginx限制访问
    有些目录存放的是一些类库文件或者模板文件, 不需要用户访问的,可以在该目录访问限制返回404。如lib类文件目录和template模板目录:
    location ~ ^/(lib|template)/ {
    return 404;
    }

    对于静态文件(如js、css、图片等)限制通过PHP执行:
    location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
    expires 0d;
    break;
    }
    }

    对于PHP程序文件,一般都是很少的几个入口文件, 可以直接限制这几个PHP文件的执行。例如现在只有index.php、user.php、admin.php三个入口文件,那我们只把这三个PHP文件交给fast-cgi文件去执行。
    location ~ ^/(index|user|admin)\.php {
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    }