Hot For Coding
PHP执行Linux命令函数

目前,PHP环境几乎都搭载在Linux环境,有时候,我们需要PHP去执行Linux命令实现一些特殊功能。介绍以下5个PHP执行Linux函数。

exec

返回结果如下

string exec ( string $command [, array &$output [, int &$return_var ]] )

// Nicholas Lee www.qttc.net

echo exec("ls");
Array
(
[0] => index.html
[1] => 10.log
[2] => 10.tar.gz
[3] => aaa.tar.gz
[4] => mytest
[5] => test1101
[6] => test1102
)

...

READ ALL

Nginx配置虚拟主机

配置虚拟主机恐怕是许多服务器常用的方式,只需要一个IP就可以划分出多个站点,下面介绍在nginx下如何配置虚拟主机

打开文件/etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

找到http,在里边加入以下代码

server
{
  listen       80;                        #端口,通常默认就好(必须)
  server_name  www.qttc.net qttc.net;     #域名,多个用空格隔开(必须)
  index index.html index.htm index.php;   #默认首页文档,多个可以增加(必须)
  root  /webs/www.qttc.net;               #虚拟主机目录(必须)

  #--自动在域名前补齐www(非必要) --#
  if ($host != 'www.qttc.net' ) {
    rewrite ^/(.*)$ https://www.qttc.net/$1 permanent;
  }

  #--为WordPress伪静态--(非必要)--#
  if (-f $request_filename/index.html) {
    rewrite (.*) $1/index.html break;
  }

  if (-f $request_filename/index.php){
    rewrite (.*) $1/index.php;
  }

  if (!-f $request_filename){
    rewrite (.*) /index.php;
  }
  #--WordPress伪静态结束--#

  #--PHP支持--如果你搭建的是PHP环境则此段要加--#
  location ~ .*\.(php|php5)?$
  {
    #fastcgi_pass  unix:/tmp/php-cgi.sock;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    include fcgi.conf;
  }
  #--PHP支持结束--#

  #--额外配置,如果线上运行最好去掉,如第一行代表开开检索(不安全)--#
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
  #--额外配置--#

  #日志打开(最新版本格式)
  access_log  /webs/logs/access_qttc.log  logs;
}

...

READ ALL

关于Nginx升级后提示日志格式错误的解决方法

Nginx升级到1.1.1*版本后

会出现如下警告

nginx: [warn] the "log_format" directive may be used only on "http" level in /etc/nginx/nginx.conf:84

主要是Nginx新版本的日志声明代码位置发生了变化,原来旧版本中,需要在每一段虚拟主机server里写如下日志格式声明

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';

...

READ ALL

Nginx支持shtml格式

对于静态网站有公共头尾需要包含,又不想用动态语言编写的,那么shtml是最佳选择了。shtml可以包含指定文件到文档中如同PHP中的include功能类似。

Nginx本身已经支持了shtml格式文件解析,但默认是不开启的,需要手动开启。

打开Nginx配置文件nginx.conf,在http里加入以下三句话。

ssi on;
ssi_silent_errors on;
ssi_types text/shtml;

保存重启nginx即可

nginx -s reload

如果需要添加默认首页,可以在nginx.conf里找到Index选项,写成

...

READ ALL

PHP获取客户端IP

有时候我们需要获取客户端的IP去实现一些Web功能,比如天气预报就需要根据访客的IP去算出客户端的地理位置才能显示相应的信息

在PHP中获取客户端的IP非常简单,主要根据$_SERVER['REMOTE_ADDR']或者$_SERVER['REMOTE_HOST']这几个变量获取

以下代码是一个获取客户端IP的例子

// Nicholas Lee www.qttc.net

function getClientIP() {
  $ipaddress = '';
  if (isset($_SERVER['HTTP_CLIENT_IP']))
    $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
  else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
  else if(isset($_SERVER['HTTP_X_FORWARDED']))
    $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
  else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
    $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
  else if(isset($_SERVER['HTTP_FORWARDED']))
    $ipaddress = $_SERVER['HTTP_FORWARDED'];
  else if(isset($_SERVER['REMOTE_ADDR']))
    $ipaddress = $_SERVER['REMOTE_ADDR'];
  else
    $ipaddress = 'UNKNOWN';
  return $ipaddress;
}

...

READ ALL

MySQL常用命令

连接

mysql -h[host] -u[user] -p[pass]

例如

mysql -h127.0.0.1 -uroot -p123456

修改密码

mysqladmin -u[user] -p[old pass] password [new pass]

例如

mysqladmin -uroot -p123456 password 654321

添加用户

grant select on [db].* to [user]@[host] identified by "[pass]"

...

READ ALL

PHP fsockopen 用法

在PHP中有一个函数fsockopen,它可以打开一个网络连接或者一个Unix套接字连接,看看使用方法

resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno
[, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

开启

要想使用这个函数,首先需要在php.ini配置文件中开启allow_url_open

GET请求

// Nicholas Lee www.qttc.net

// Open
$fp = fsockopen("www.qttc.net", 80, $errno, $errstr, 30);

if(!$fp){
  die($errstr);
}

set_time_limit(0);

// Header
$http = "GET / HTTP/1.1\r\n";
$http .= "Host: www.qttc.net\r\n";
$http .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$http .= "Connection: Close\r\n\r\n";

// Send
fwrite($fp, $http);

// Response
$out = '';
while (!feof($fp)) {
  $out .= fgets($fp, 128);
}

echo $out;
fclose($fp);

...

READ ALL

Linux curl命令

curl命令在Linux下可以发起HTTP请求,也可以当作文件下载工具,它不仅可以使用GET方式,也可以发起POST方式请求并且自定义请求头部,十分方便强大的HTTP请求工具

GET

要试用curl发起一个GET请求特别简单,直接后边跟一个URL即可

curl [URL]

如:

curl https://www.qttc.net

如果服务器返回是文本的话,它会直接输出内容

POST

curl使用POST方式请求也特别简单,格式如下:

curl -d "{param1:value1,param2:value2}" -H "Content-Type: application/json" -X POST https://www.qttc.net

...

READ ALL

PHP特定函数foreach的用法

PHP 4 引入了foreach结构,和Perl以及其他语言很像。这只是一种遍历数组简便方法。foreach仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种比较次要但却是第一种的有用的扩展。

// Nicholas Lee www.qttc.net

foreach (array_expression as $value)
  statement
foreach (array_expression as $key => $value)
  statement

第一种格式遍历给定的array_expression数组。每次循环中,当前单元的值被赋给 $value并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。 第二种格式做同样的事,只是除了当前单元的键名也会在每次循环中被赋给变量 $key。

...

READ ALL

PHP测试耗时

关于耗时

通常对PHP程序的优化首要点就是要知道哪里是瓶颈点,查出瓶颈点是优化程序的必要条件,就好比如你要优化网站程序一样,是加载速度慢还是数据查询返回慢。所以要能掌握程序中的瓶颈点最通俗的做法就是跟踪代码,知道每一步耗时多少,然后把耗时占比最大的或者明显超出它计划耗时这几部分程序列入重点优化目标,程序运行耗时跟服务器实时环境要有关,所以即使同一台机器每次运行结果耗时可能都会与上一次有细微的差别,所以以耗时来判断程序是否是瓶颈主要都是以自我经验去判断。

统计运行耗时

如何知道PHP程序运行耗时多少呢?有很多工具都可以协助我们去跟踪我们的程序每一步的耗时,这里也给一个简要版本的代码

...

READ ALL