php小分点
2016-02-28 23:54
651 查看
1. 变量函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找 与变量的值相同的函数,并且将尝试执行它。除了别的事情以外,这个可以被 用于实现回调函数,函数表等等。
class Foo
{
function Var()
{
$name = 'Bar';
$this->$name(); // This calls the Bar() method
}
function Bar()
{
echo "This is Bar";
}
}
$foo = new Foo();
$funcname = "Var";
$foo->$funcname(); // This calls $foo->Var()
2. 对象复制中引用的区别:
class a{
public $name = 'ajia';
//只在使用clone关键词进行对象复制时候起作用
public function __clone(){
$this->name = 'youxi';
}
}
$a = new a();
$b = clone $a; //使用clone关键词来对象复制是值的复制,也就是说$a和$b指向的是两个不同的实例,如果直接使用$b = $a 的话就是引用的复制,php5.3以后默认的对象复制是引用复制
var_dump($a);
var_dump($b);
$redis->pexpireAt( 键值, 微秒 ):设置在某个时间点过期,单位是微秒
$redis->psetex($键值, 微秒, 值);设置值同时设定过期时间
3. 分表的表名取名字的方法之一:
$table_name = 'js_coupon_user_'.($user_id%10+1);
4. array_multisort多维数组排序
$users = array(
array('name' => 'tom', 'age' => 20)
, array('name' => 'anny', 'age' => 18)
, array('name' => 'jack', 'age' => 22)
, array('name' => 'ajia', 'age' => 22)
);
$ages = $names = array();
foreach ($users as $user) {
$ages[] = $user['age'];
$names[] = $user['name'];
}
array_multisort($ages, SORT_ASC, $names, SORT_DESC, $users);
print_r($users);
5================
1.socket协议:AF_INET AF_INET6 AF_UNIX
2.socket类型:SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM
3.公共协议类型:
icmp: Internet Control Message Protocol 互联网控制信息协议,用于主机和网关之间,检测网络状况和报告错误
UDP: User Datagram Protocol 是一个无连接的、不可靠的、具有固定最大长度的报文协议。由于这些特性,UDP 协议拥有最小的协议开销。
TCP: ransmission Control Protocol 是一个可靠的、基于连接的、面向数据流的全双工协议。TCP 能够保障所有的数据包是按照其发送顺序而接收的。如果任意数据包在通讯时丢失,TCP 将自动重发数据包直到目标主机应答已接收。因为可靠性和性能的原因,TCP 在数据传输层使用
8bit 字节边界。因此,TCP 应用程序必须允许传送部分报文的可能。
$commonProtocol = getprotobyname("tcp"); //通过getprotobyname函数获取tcp协议号码,也就是公共协议类型
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol); //socket_create函数的3个参数就是以上socket链接的3个组成部分,第三个参数是公共协议类型,除了用getprotobyname函数生成,还可以直接使用常量
SOL_TCP 和 SOL_UDP
socket_bind($socket, 'localhost', 1337); //socket绑定到一个IP地址和某一个端口上
socket_listen($socket); //监听所有进来的socket连接
// More socket functionality to come
6============
gethostbyname($host); //根据域名获取主机也就是ip地址
7. defined():判断"常量"是否已经存在
8. realpath('./redis/send.php'); //获取绝对路径
9. $_SERVER['SCRIPT_FILENAME'] //执行文件的路径 ,__FILE__:__FILE__常量所在的文件路径
10==========
set_include_path('redis/'); //动态修改php配置文件中include_path的值,require和include包含文件时候会先去该参数所指定的路径去查找
set_include_path( get_include_path().PATH_SEPARATOR."socket/" ); //在原有的include_path值后新增路径
$includePath = ini_get('include_path');
$includePath2 = get_include_path(); //获取php配置文件中include_path的值
ps:
如果在指定的目录下找不到所要求包含的文件,而在当前页面目录下正好存在这个名称的文件时,则默认引入当前目录下的该文件。
当指定了多个目录为 include_path ,而所要求包含的文件在这几个目录都有相同名称的文件存在时,php选择使用设定 include_path 时排位"居前"的目录下的文件。
11==========
$b = file_put_contents("youxi.php",''); //写入空内容生成文件
var_dump($b);
exit;
$time = time()-3600;
$a = touch("ajia.php", $time); //如果文件不存在则生成文件,存在则修改文件的修改时间
var_dump($a);
12==========
$path = "/testweb/home.php";
echo basename($path); //显示带有文件扩展名的文件名
echo basename($path,".php"); //显示不带有文件扩展名的文件名
13==========
define( "SEPARATOR", "/" );
define( "__ROOT__", dirname(__FILE__) );
//$fileName = basename(__FILE__ , ".php"); //第二个参数是过滤作用
$appDir = __ROOT__.SEPARATOR."app";
if( true !== is_dir($appDir) ){
$rel = mkdir( $appDir, 0755, true ); //默认创建的目录权限是小于等于系统umask权限
//chmod( $appDir, 0777 ); //chmod不会受umask的限制,可建立任意权限
}
$tem = is_writeable($appDir); //判断是否可写
var_dump($tem);
14==========
register_shutdown_function( array('ajia', 'demo') ); //参数可以直接是函数名,可以是array('类名','静态方法名称')
//注册php进程终止后的回调函数,该函数被执行的情况可以是:
1、当页面被用户强制停止时,使用exit、die等函数
2、当程序代码运行超时时
3、当php代码执行完成时
15==========
ob_start(); //表示从这里开始进入缓冲区,如果没有使用该函数则默认是从php进程开始
$a = ob_get_contents(); //获取缓冲区内容
ob_flush(); //输出缓冲区内容
ob_clean(); //清空缓冲区内容
ob_end_flush(); //输出缓冲区内容并关闭缓冲区
ob_end_clean(); //清空缓冲区内容并且关闭缓冲区
16==========
get_defined_constants(true/false) //获取已经通过define定义的常量,参数为true,则会区分常量的用户还是系统
strip_tags( 字符串,需要保留的标签 ):过滤字符串中的html或xml标签
strtolower( 字符串 ):将字符串全部转换为小写,strtouper则相反
ucfirst( 字符串,大小写标识 ):将字符串首字母转换成大小写,默认是大写
array_search与in_array()类似
array_walk():对数组元素(一维数组)进行回调函数,例如:
$arr = array("ajia" => 37, "youxi"=>18);
//第一个参数是数组的值,第二个是数组的key,第三个开始是array_walk传递给回调函数的参数
function is_call_back( $value, $key ){
echo "{$key} age is: {$value}";
}
array_walk( $arr, "is_call_back" );
而array_walk_recursive()则可以对二位数组进行回调函数处理
class_exists( 类名,是否自动加载 ):判断类是否被定义,默认会自动执行__autoload()加载
//通过反射类执行类方法的2中方式
class BlogAction {
public function detail() {
echo 'detail' . "\r\n";
}
}
$blog = new BlogAction(); //实例化
// ReflectionMethod反射类直接反射到类的方法,并不能直接判断该方法是否存在,通过try{}catch{}来捕捉异常
try{
$method = new ReflectionMethod('BlogAction', 'detaigl'); //第一个参数可以是类名或者实例化对象
$method->invoke( $blog );
}catch ( Exception $e ){
$msg = $e->getMessage();
echo $msg;
}
$class = new ReflectionClass($blog); //第一个参数可以是类名或者实例化对象
$isExists = $class->hasMethod('detssail');
if( true === $isExists ){
$classMethod = $class->getMethod('detail');
$classMethod->invoke($blog);
}
//异常处理
set_exception_handler( 'meEx' );
//指定程序出现异常的处理方法,但是使用try{}catch{}的流程,则不会经过该指定方法,而是执行catch中的过程
//对于异常:要么通过try{}catch{}来捕捉,要么通过主动的throw new Exception()抛出
SAPI(Server Application Programming Interface): 服务器端应用编程端口,它提供了一个接口,使得PHP可以和其他应用进行交互数据;默认提供了很多种SAPI, 常见的给apache的mod_php5、CGI,给IIS的ISAPI,还有Shell的CLI
17==========
$className = get_class( $this ); 获取类名,而__CLASS__则表示当前的类名
18==========
echo getmypid(); 返回 PHP 的进程id ( php-fpm模式下,则返回的是真正执行php命令的进程的id) posix_getpid()也是该作用
echo $_SERVER['USER'] 取得 PHP 进程id的拥有者名称 ( php-fpm模式下,则返回的是真正执行php命令的进程所有者名称 )
echo get_current_user(); 取得 PHP 进程id的拥有者名称 ( php-fpm模式下,则返回的是master process所有者的名称 )
echo mysql_thread_id(数据库连接资源id); 显示连接到mysql的进程id,如果是长连接的,可以通过show processlist 来查看到该id
19==========
php的cli文件(php)所在路径:/usr/local/php/bin/php
1.让 PHP 运行指定文件。
/usr/local/php/bin/php my_script.php
/usr/local/php/bin/php -f my_script.php
ps:以上两种方法(使用或不使用 -f 参数)都能够运行给定的 my_script.php 文件。您可以选择任何文件来运行,您指定的 PHP 脚本并非必须要以 .php 为扩展名,它们可以有任意的文件名和扩展名。
2.在命令行直接运行 PHP 代码。
/usr/local/php/bin/php -r 'print_r(get_defined_constants());' #尽量使用单引号
ps:在使用这种方法时,请您注意外壳变量的替代及引号的使用。
请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。
3.将php脚本处理成自允许脚本:在php代码第一行加入:#! /usr/local/php/bin/php 后面的代码依旧是不变, 在赋予该文件可执行的权限,然后执行该文件即可
4.php脚本接受参数,在脚本后面直接带上参数,多个参数用空格分隔,含有空格的参数值需要用引号括起,在php代码中使用$argv变量来获取所有的参数,例如:
命令行:/usr/local/php/bin/php my_script.php 'ajia is good' 99
my_script.php代码:
<?php print_r( $argv ); ?>
20==========
set_time_limit():设置允许脚本运行的时间,单位为秒。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。
当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。
如果设置为0(零),没有时间方面的限制。
===>>>>>>>仅计算脚本自己执行的时间,调用system(),io操作,数据库查询,sleep() 函数不计算在脚本执行时间之内.
ignore_user_abort():设置与客户机断开是否会终止脚本的执行。可与set_time_limit配合使用,代码如下:
<?php
ignore_user_abort ( TRUE );
set_time_limit ( 0 );
$interval = 10;
$stop = 1;
do {
if( $stop == 10 ) break;
file_put_contents('liuhui.php',' Current Time: '.time().' Stop: '.$stop); //即使客户端终止脚本,仍然每隔10秒钟执行一次,并打印出当前时间与终止点
$stop++;
sleep ( $interval );
} while ( true );
?>
class Foo
{
function Var()
{
$name = 'Bar';
$this->$name(); // This calls the Bar() method
}
function Bar()
{
echo "This is Bar";
}
}
$foo = new Foo();
$funcname = "Var";
$foo->$funcname(); // This calls $foo->Var()
2. 对象复制中引用的区别:
class a{
public $name = 'ajia';
//只在使用clone关键词进行对象复制时候起作用
public function __clone(){
$this->name = 'youxi';
}
}
$a = new a();
$b = clone $a; //使用clone关键词来对象复制是值的复制,也就是说$a和$b指向的是两个不同的实例,如果直接使用$b = $a 的话就是引用的复制,php5.3以后默认的对象复制是引用复制
var_dump($a);
var_dump($b);
$redis->pexpireAt( 键值, 微秒 ):设置在某个时间点过期,单位是微秒
$redis->psetex($键值, 微秒, 值);设置值同时设定过期时间
3. 分表的表名取名字的方法之一:
$table_name = 'js_coupon_user_'.($user_id%10+1);
4. array_multisort多维数组排序
$users = array(
array('name' => 'tom', 'age' => 20)
, array('name' => 'anny', 'age' => 18)
, array('name' => 'jack', 'age' => 22)
, array('name' => 'ajia', 'age' => 22)
);
$ages = $names = array();
foreach ($users as $user) {
$ages[] = $user['age'];
$names[] = $user['name'];
}
array_multisort($ages, SORT_ASC, $names, SORT_DESC, $users);
print_r($users);
5================
1.socket协议:AF_INET AF_INET6 AF_UNIX
2.socket类型:SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM
3.公共协议类型:
icmp: Internet Control Message Protocol 互联网控制信息协议,用于主机和网关之间,检测网络状况和报告错误
UDP: User Datagram Protocol 是一个无连接的、不可靠的、具有固定最大长度的报文协议。由于这些特性,UDP 协议拥有最小的协议开销。
TCP: ransmission Control Protocol 是一个可靠的、基于连接的、面向数据流的全双工协议。TCP 能够保障所有的数据包是按照其发送顺序而接收的。如果任意数据包在通讯时丢失,TCP 将自动重发数据包直到目标主机应答已接收。因为可靠性和性能的原因,TCP 在数据传输层使用
8bit 字节边界。因此,TCP 应用程序必须允许传送部分报文的可能。
$commonProtocol = getprotobyname("tcp"); //通过getprotobyname函数获取tcp协议号码,也就是公共协议类型
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol); //socket_create函数的3个参数就是以上socket链接的3个组成部分,第三个参数是公共协议类型,除了用getprotobyname函数生成,还可以直接使用常量
SOL_TCP 和 SOL_UDP
socket_bind($socket, 'localhost', 1337); //socket绑定到一个IP地址和某一个端口上
socket_listen($socket); //监听所有进来的socket连接
// More socket functionality to come
6============
gethostbyname($host); //根据域名获取主机也就是ip地址
7. defined():判断"常量"是否已经存在
8. realpath('./redis/send.php'); //获取绝对路径
9. $_SERVER['SCRIPT_FILENAME'] //执行文件的路径 ,__FILE__:__FILE__常量所在的文件路径
10==========
set_include_path('redis/'); //动态修改php配置文件中include_path的值,require和include包含文件时候会先去该参数所指定的路径去查找
set_include_path( get_include_path().PATH_SEPARATOR."socket/" ); //在原有的include_path值后新增路径
$includePath = ini_get('include_path');
$includePath2 = get_include_path(); //获取php配置文件中include_path的值
ps:
如果在指定的目录下找不到所要求包含的文件,而在当前页面目录下正好存在这个名称的文件时,则默认引入当前目录下的该文件。
当指定了多个目录为 include_path ,而所要求包含的文件在这几个目录都有相同名称的文件存在时,php选择使用设定 include_path 时排位"居前"的目录下的文件。
11==========
$b = file_put_contents("youxi.php",''); //写入空内容生成文件
var_dump($b);
exit;
$time = time()-3600;
$a = touch("ajia.php", $time); //如果文件不存在则生成文件,存在则修改文件的修改时间
var_dump($a);
12==========
$path = "/testweb/home.php";
echo basename($path); //显示带有文件扩展名的文件名
echo basename($path,".php"); //显示不带有文件扩展名的文件名
13==========
define( "SEPARATOR", "/" );
define( "__ROOT__", dirname(__FILE__) );
//$fileName = basename(__FILE__ , ".php"); //第二个参数是过滤作用
$appDir = __ROOT__.SEPARATOR."app";
if( true !== is_dir($appDir) ){
$rel = mkdir( $appDir, 0755, true ); //默认创建的目录权限是小于等于系统umask权限
//chmod( $appDir, 0777 ); //chmod不会受umask的限制,可建立任意权限
}
$tem = is_writeable($appDir); //判断是否可写
var_dump($tem);
14==========
register_shutdown_function( array('ajia', 'demo') ); //参数可以直接是函数名,可以是array('类名','静态方法名称')
//注册php进程终止后的回调函数,该函数被执行的情况可以是:
1、当页面被用户强制停止时,使用exit、die等函数
2、当程序代码运行超时时
3、当php代码执行完成时
15==========
ob_start(); //表示从这里开始进入缓冲区,如果没有使用该函数则默认是从php进程开始
$a = ob_get_contents(); //获取缓冲区内容
ob_flush(); //输出缓冲区内容
ob_clean(); //清空缓冲区内容
ob_end_flush(); //输出缓冲区内容并关闭缓冲区
ob_end_clean(); //清空缓冲区内容并且关闭缓冲区
16==========
get_defined_constants(true/false) //获取已经通过define定义的常量,参数为true,则会区分常量的用户还是系统
strip_tags( 字符串,需要保留的标签 ):过滤字符串中的html或xml标签
strtolower( 字符串 ):将字符串全部转换为小写,strtouper则相反
ucfirst( 字符串,大小写标识 ):将字符串首字母转换成大小写,默认是大写
array_search与in_array()类似
array_walk():对数组元素(一维数组)进行回调函数,例如:
$arr = array("ajia" => 37, "youxi"=>18);
//第一个参数是数组的值,第二个是数组的key,第三个开始是array_walk传递给回调函数的参数
function is_call_back( $value, $key ){
echo "{$key} age is: {$value}";
}
array_walk( $arr, "is_call_back" );
而array_walk_recursive()则可以对二位数组进行回调函数处理
class_exists( 类名,是否自动加载 ):判断类是否被定义,默认会自动执行__autoload()加载
//通过反射类执行类方法的2中方式
class BlogAction {
public function detail() {
echo 'detail' . "\r\n";
}
}
$blog = new BlogAction(); //实例化
// ReflectionMethod反射类直接反射到类的方法,并不能直接判断该方法是否存在,通过try{}catch{}来捕捉异常
try{
$method = new ReflectionMethod('BlogAction', 'detaigl'); //第一个参数可以是类名或者实例化对象
$method->invoke( $blog );
}catch ( Exception $e ){
$msg = $e->getMessage();
echo $msg;
}
$class = new ReflectionClass($blog); //第一个参数可以是类名或者实例化对象
$isExists = $class->hasMethod('detssail');
if( true === $isExists ){
$classMethod = $class->getMethod('detail');
$classMethod->invoke($blog);
}
//异常处理
set_exception_handler( 'meEx' );
//指定程序出现异常的处理方法,但是使用try{}catch{}的流程,则不会经过该指定方法,而是执行catch中的过程
//对于异常:要么通过try{}catch{}来捕捉,要么通过主动的throw new Exception()抛出
SAPI(Server Application Programming Interface): 服务器端应用编程端口,它提供了一个接口,使得PHP可以和其他应用进行交互数据;默认提供了很多种SAPI, 常见的给apache的mod_php5、CGI,给IIS的ISAPI,还有Shell的CLI
17==========
$className = get_class( $this ); 获取类名,而__CLASS__则表示当前的类名
18==========
echo getmypid(); 返回 PHP 的进程id ( php-fpm模式下,则返回的是真正执行php命令的进程的id) posix_getpid()也是该作用
echo $_SERVER['USER'] 取得 PHP 进程id的拥有者名称 ( php-fpm模式下,则返回的是真正执行php命令的进程所有者名称 )
echo get_current_user(); 取得 PHP 进程id的拥有者名称 ( php-fpm模式下,则返回的是master process所有者的名称 )
echo mysql_thread_id(数据库连接资源id); 显示连接到mysql的进程id,如果是长连接的,可以通过show processlist 来查看到该id
19==========
php的cli文件(php)所在路径:/usr/local/php/bin/php
1.让 PHP 运行指定文件。
/usr/local/php/bin/php my_script.php
/usr/local/php/bin/php -f my_script.php
ps:以上两种方法(使用或不使用 -f 参数)都能够运行给定的 my_script.php 文件。您可以选择任何文件来运行,您指定的 PHP 脚本并非必须要以 .php 为扩展名,它们可以有任意的文件名和扩展名。
2.在命令行直接运行 PHP 代码。
/usr/local/php/bin/php -r 'print_r(get_defined_constants());' #尽量使用单引号
ps:在使用这种方法时,请您注意外壳变量的替代及引号的使用。
请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上 -r 参数后,这些标记符是不需要的,加上它们会导致语法错误。
3.将php脚本处理成自允许脚本:在php代码第一行加入:#! /usr/local/php/bin/php 后面的代码依旧是不变, 在赋予该文件可执行的权限,然后执行该文件即可
4.php脚本接受参数,在脚本后面直接带上参数,多个参数用空格分隔,含有空格的参数值需要用引号括起,在php代码中使用$argv变量来获取所有的参数,例如:
命令行:/usr/local/php/bin/php my_script.php 'ajia is good' 99
my_script.php代码:
<?php print_r( $argv ); ?>
20==========
set_time_limit():设置允许脚本运行的时间,单位为秒。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。
当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。
如果设置为0(零),没有时间方面的限制。
===>>>>>>>仅计算脚本自己执行的时间,调用system(),io操作,数据库查询,sleep() 函数不计算在脚本执行时间之内.
ignore_user_abort():设置与客户机断开是否会终止脚本的执行。可与set_time_limit配合使用,代码如下:
<?php
ignore_user_abort ( TRUE );
set_time_limit ( 0 );
$interval = 10;
$stop = 1;
do {
if( $stop == 10 ) break;
file_put_contents('liuhui.php',' Current Time: '.time().' Stop: '.$stop); //即使客户端终止脚本,仍然每隔10秒钟执行一次,并打印出当前时间与终止点
$stop++;
sleep ( $interval );
} while ( true );
?>
相关文章推荐
- php执行流程相关
- 在内网建一个FTP服务器,并且可以通过外网访问
- 集成了Laravel的Eloquent ORM的Yaf框架
- ContentProvider 报线程错误
- thinkPHP入门(一):基础
- 构建自己的PHP框架--实现Model类(1)
- 【函数库】PHP RXData(RPGXP数据文件) 解析库 V1.0
- PHP实现多线程抓取网页
- 基于curl的php多线程类(异步请求)
- PHP Curl多线程原理实例详解
- PHP CURL 多线程 GET/POST 类
- php\symfony3 学习记录(三) 路由和控制器
- PHP文件上传实例
- ThinkPHP实现支付宝接口功能
- 对FileInputStream和FileOutputStream的应用
- ajax用法示例
- 对ByteArrayOutputStream和ByteArrayInputStream的应用
- 24.php中使用Iterator,ArrayAccess和Countable
- 在内网建一个FTP服务器,并且可以通过外网访问
- vsftpd虚拟用户配置【虚拟用户映射到系统账号vuser{禁止该账户登录}登录ftp】