邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php DatePeriod类

php DatePeriod类 

获取一个日期列表

<?php


$start = new DateTime('2016-05-01');
//$interval  = new DateInterval('P1D'); //  P2W  正序日期,P1D间隔是天,P2W间隔是两周
$interval  = DateInterval::createFromDateString('-1 day'); // 倒序
$period  = new DatePeriod($start,$interval,3);
foreach ($period as  $dateTime) {
$date = $dateTime->format('Y-m-d');
echo $date;
echo "<br>"; 

}


php.ini 配置参数详解及优化
php.ini 配置参数详解及优化

php解释器在php.ini文件中配置和调优。

内存
memory_limit = 128 
用于设定单个php进程可以使用的系统内存的最大值。
默认值是128M,这对大多数中小型php应用来说或许合适。可是如果运行的是微型php应用,可以降低这个值,例如设为64M,节省系统资源。

zend opcahce
确定要分配多少内存后,我们会配置php的zend opcache扩展。这个扩展用于缓存操作码。
每次http请求时,首先nginx把http请求转发给php-fpm,php-fpm再把请求交给某个php子进程处理。php进程找到相应的php脚本后,读取脚本,把php脚本编译成操作码(或字节码)格式,然后执行编译得到的操作码,生成响应。最后,把http响应发给nginx,nginx再把响应发给http客户端。这样的话每次http请求都要消耗很多资源。
我们可以缓存编译每个http脚本得到的操作码,加速这个处理过程。缓存后,我们可以从缓存中直接读取并执行预先编译好的操作码,不用每次处理http请求时都查找、读取和编译php脚本。
优化zend opcahce扩展的设置 
opcache.memory_consumption=64   //php7默认是64
opcache.interned_strings_buffer=16 //php7默认是4
opcache.max_accelerated_files=4000 //php7默认是2000
opcache.validate_timestamps=1 //php7默认是1
opcache.revalidate_freq=0 //php7默认是2
opcache.fast_shutdown=1 //php7默认是0

opcache.memory_consumption=64
为操作码缓存分配的内存量(单位MB)。分配的内存量应该够保存应用中所有php脚本编译得到的操作码。如果是小型的php应用,脚本数较少,可以设为较低的值,例如16M

opcache.interned_strings_buffer=16
用来存储驻留字符串的内存量(单位MB)。
php解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,php解释器会使用指针,这样能节省内存。默认情况下,php驻留的字符串会隔离在各个php进程中。这个设置能让php-fpm进程池中的所有进程把驻留字符串存储到共享的缓冲区中,以便在php-fpm进程池中的多个进程之间引用驻留字符串。这样能节省内存。这个的默认值是4M,可以设为16M

opcache.max_accelerated_files=4000
操作码缓存中最多能存储多少个php脚本。这个设置的值可以在200-100000之间的任何数。这个值一定要比php应用中的文件数量大。

opcache.validate_timestamps=1
这个值设为1时,经过一段时间后php会检查php脚本的内容是否变化。检查的时间间隔由opcache.revalidate_freq设置指定。如果这个设置的值为0,php不会检查php脚本的内容是否变化,我们必须手动清除缓存的操作码。建议开发环境中设为1,生产环境设为0 


opcache.revalidate_freq=0
这个设置多久(单位是秒)检查一次php脚本的内容是否变化。缓存的好处是不用每次都重新编译php脚本。这个设置用于确定在多长时间内认为操作码是新的。 在这段时间之后,php会检查php脚本的内容是否有变化。如果有变化,php会重新编译脚本,再次缓存。

opcache.fast_shutdown=1
这个设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给zend Enginer的内存管理器去完成。


文件上传

这个应该都懂
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
如果需要上传更大的文件,需要调整nginx配置中的client_max_body_size参数


最长执行时间
这个参数用于设定单个php进程在终止之前最长可以运行多少时间。
max_execution_time = 5  //默认是30
在php脚本中可以调用set_time_limit()函数来覆盖这个值。

如果需要运行更长的时间,则要在单独的进程中运行。
比如要生成报告,把结果制作成pdf文件,这个任务大概需要10分钟完成。我们要单独编译一个php文件,为create.php
<?php
exec('echo "create.php"|at now');
echo 'report pending...';
?>


处理会话
session.save_handle = 'memcached'
session.save_path = '127.0.0.1:11211'

缓存输出
如果在较少的块中发送更多的数据,而不是在较多的块中发送较少的数据,那么网络的效率会更多。也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少http请求总数。
因此,我们要让php缓冲输出。默认情况下,php已经启用了输出缓冲功能。php缓冲4096字节的输出之后才会把其中的内容发送给web服务器。推荐设置
output_buffering = 4096
implicit_flush = false


真实路径缓存
php会缓存应用使用的真是路径,这样每次包含或导入文件时就无需不断搜素包含路径了。这个缓存叫真实缓存路径。如果运行的是大型php文件(Drupal和Composer组件等),使用了大量文件,增加php真实路径缓存的大小就能得到更好的性能。
真实路径缓存的默认大小是16K。这个缓存所需要的准确大小不容易确定,不过可以使用一个小技巧。首先,增加真实路径缓存的大小,设为特别大的值,例如256K。然后在这个php脚本的末尾加上print_r(realpath_cache_size());输出真实路径缓存的真正大小。最后,把真实路径缓存的大小改为这个真正的值。我们可以在php.ini文件中设置真实路径缓存的大小:
realpath_cache_size = 64K

php-fpm.conf 配置参数详解及优化
php-fpm.conf 配置参数详解及优化

emergency_restart_threshold = 10
在指定的一段时间内,如果失效的php-fpm子进程数超过这个值,php-fpm主进程优雅重启
emergency_restart_interval = 1m   
设定emergency_restart_threshold 设置采用的时间跨度,s(econds), m(inutes), h(ours), or d(ays)


user = www
拥有这个php-fpm进程池中子进程的系统用户。要把这个设置的值设为运行php应用的非根用户的用户名。

group = www
拥有这个php-fpm进程池中子进程的系统用户组。要把这个设置的值设为运行php应用的非根用户的所属的用户组名。

listen = 127.0.0.1:9000
php-fpm进程池监听的ip地址和端口号,让php-fpm只接受nginx从这里传入的请求。127.0.0.1:9000让指定的php-fpm进程池监听从本地端口9000进入的连接。
可以使用任何不需要特殊权限(大于1024)且没被其他系统进程占用的端口号。

listen.allowed_clients = 127.0.0.1
可以向这个php-fpm进程池发送请求的ip地址(一个或多个)。为了安全,把这个设置为127.0.0.1,即只有当前设备能把请求转发给这个php-fpm进程池。默认情况下,这个是被注释掉的。


pm.max_children = 51
这个设置设定任何时间点php-fpm进程池中最多能有多少个进程。这个设置没有绝对正确的值,应该测试你的php应用,确定每个php进程需要使用多少个内存,然后把这个设置设为设备可能内存能容纳的php进程总数。对大多数中小型php应用来说,每个php进程要使用5-15M内存,假如我们使用的设备为这个php-fpm进程池分配了512可用的内存,每个进程大约10M,就是51个进程。


pm.start_servers = 3
php-fpm启动时php-fpm进程池中立即可用的进程数。同样的,这个设置也没有绝对的正确值。对大多数中小型php应用来说,设置2或者3。这么做是为了先准备好的三个进程,等待请求进入,不让php应用的头几个http请求等待php-fpm初始化进程中的进程。


pm.min_spare_servers = 2
php应用空闲时php-fpm进程池中可以存在的进程数量最小值。这个设置的值一般与php.start_servers设置的值一样,用于确保新进入的http请求无需等待php-fpm在进程中重新初始化进程。


pm.max_spare_servers = 4
php应用空闲时php-fpm进程池中可以存在的进程数量最大值。这个设置的值一般比php.start_servers设置的值要大些,用于确保新进入的http请求无需等待php-fpm在进程池中重新初始化进程。

pm.max_requests = 1000
回收进程之前,php-fpm进程池中各个进程最多能处理的http请求数量。这个设置有助于避免php扩展或者库因编写拙劣而导致不断泄漏内存。建议设置未1000,可根据应用的需求做调整。

slowlog = /path/to/slowlog.log
这个设置的值是一个日志文件在系统文件中的绝对路径。这个日志文件拥有记录处理时间超过N秒的http请求信息,比便找出php应用的瓶颈,进行调试。php-fpm进程池属于的用户和用户组必须有这个文件的写入权限。

request_slowlog_timeout = 5s
如果当前http请求的处理时间超过指定的值,就把请求的回溯信息写入slowlog设置指定的文件。把这个设置的值设置为多少,取决于你认为多长时间算久。一开始,可以设置为5s,s(econds), m(inutes), h(ours), or d(ays)


php回调、匿名函数、闭包事例
<?php
//php回调、匿名函数、闭包 事例
class Product{
public $name;
public $price;
function __CONSTRUCT($name,$price){
$this->name = $name;
$this->price = $price;
}
}

class ProcessSale{
private $callbacks;
public function registerCallback($callback){
if(!is_callable($callback)){
throw new Exception("Error Processing Request", 1);
}
$this->callbacks[] = $callback;
}
public function sale($product){
print "{$product->name}:Processing <br>";
foreach ($this->callbacks as $callback) {
call_user_func($callback,$product);
}
}
}

class Totalizer{
static function warnAmount($amt){
$count = 0;
return function ($product) use ($amt,&$count){
$count += $product->price;
print "count : $count <br>";
if($count > $amt){
print "high price reached: {$count} <br>";
}
};
}
}

$processor = new ProcessSale();
$processor->registerCallback(Totalizer::warnAmount(8));
$processor->sale(new Product("shoes",6));
$processor->sale(new Product("coffes",6));



?>
关于php的延迟静态绑定
<?php
abstract class Shop{
public static function create(){
//new static(); static类似于self,但它指的是被调用的类而不是包含类。他的意思是将生成一个新的Shop2对象,而不是试图实例化一个shop对象
return new self();  
}
}
class Shop1 extends Shop{
public static function create(){
return  'shop1';
}
}
class Shop2 extends Shop{
public static function create(){
return  'shop2';
}
}

print_r(Shop2::create());

?>
php设计模式之单例模式简单示例
<?php
//单例模式 
class Singleton {

    private static $instance=null;
    private $value=null;
    
    private function __construct($value) {
        $this->value = $value;
    }

    public static function getInstance() {
        //echo self::$instance."<br/>";
        if ( self::$instance == null ) {
            echo "<br>new<br>";
            self::$instance = new Singleton("values");
        } else {
            echo "<br>old<br>";
        }
        return self::$instance;
    }
}

$x = Singleton::getInstance();
var_dump($x); // returns the new object


$y = Singleton::getInstance();
var_dump($y); // returns the existing object


?>

php几个实用少见的函数
1.函数的任意数目的参数 func_get_args()
你可能知道PHP允许你定义一个默认参数的函数。但你可能并不知道PHP还允许你定义一个完全任意的参数的函数
例子
<?php
function foo(){
   $numargs  =  func_num_args ();
   echo  "Number of arguments:  $numargs <br />\n" ;
   if ( $numargs  >=  2 ) {
       echo  "Second argument is: "  .  func_get_arg ( 1 ) .  "<br />\n" ;
   }
   $arg_list  =  func_get_args ();
   for ( $i  =  0 ;  $i  <  $numargs ;  $i ++) {
       echo  "Argument  $i  is: "  .  $arg_list [ $i ] .  "<br />\n" ;
   }
}
foo ( 1 ,  2 ,  3 );
?> 


2.使用 Glob() 查找文件
例子
// 取得所有的后缀为PHP的文件 
$files = glob('*.php');
// 取PHP文件和TXT文件 
$files = glob('*.{php,txt}', GLOB_BRACE); 
//还可以加上路径:
$files = glob('../images/a*.jpg'); 
//如果你想得到绝对路径,你可以调用?realpath() 函数:
$files = glob('../images/a*.jpg');       
// applies the function to each array element 
$files = array_map('realpath',$files); 


3. 内存使用信息
PHP 是有垃圾回收机制的,而且有一套很复杂的内存管理机制。你可以知道你的脚本所使用的内存情况。要知道当前内存使用情况,你可以使用? memory_get_usage() 函数,如果你想知道使用内存的峰值,你可以调用memory_get_peak_usage() 函数。

echo "Initial: ".memory_get_usage()." bytes \n"; 
/* 输出 
Initial: 361400 bytes 
*/ 
// 使用内存 
for ($i = 0; $i < 100000; $i++) { 
    $array []= md5($i); 

// 删除一半的内存 
for ($i = 0; $i < 100000; $i++) { 
    unset($array[$i]); 
}
echo "Final: ".memory_get_usage()." bytes \n"; 
/* prints 
Final: 885912 bytes 
*/  
echo "Peak: ".memory_get_peak_usage()." bytes \n"; 
/* 输出峰值 
Peak: 13687072 bytes 
*/


4.CPU使用信息
使用?getrusage() 函数可以让你知道CPU的使用情况。注意,这个功能在Windows下不可用。
例子
<?php
$dat  =  getrusage ();
echo  $dat [ "ru_nswap" ];          // number of swaps
echo  $dat [ "ru_majflt" ];         // number of page faults
echo  $dat [ "ru_utime.tv_sec" ];   // user time used (seconds)
echo  $dat [ "ru_utime.tv_usec" ];  // user time used (microseconds)
?> 

5.生成唯一的ID
有很多人使用 md5() 来生成一个唯一的ID,如下所示:
// generate unique string 
echo md5(time() . mt_rand(1,1000000)); 

其实,PHP中有一个叫?uniqid() 的函数是专门用来干这个的:
// generate unique string 
echo uniqid(); 
可以加上前缀
 // 前缀 
echo uniqid('foo_'); 
/* 输出 
foo_4bd67d6cd8b8f 
*/ 

// 有更多的熵 
echo uniqid('',true); 
/* 输出 
4bd67d6cd8b926.12135106 
*/ 

// 都有 
echo uniqid('bar_',true); 
/* 输出 
bar_4bd67da367b650.43684647 
*/ 


6.字符串压缩

当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了?gzcompress() 和 gzuncompress() 函数:
$string = '****这里是比较大的字符串';
$compressed = gzcompress($string);       
echo "Original size: ". strlen($string)."\n"; 
/* 输出原始大小 
Original size: 800 
*/ 
echo "Compressed size: ". strlen($compressed)."\n"; 
/* 输出压缩后的大小 
Compressed size: 418 
*/ 
// 解压缩 
$original = gzuncompress($compressed); 

几乎有50% 压缩比率。同时,你还可以使用?gzencode() 和 gzdecode() 函数来压缩,只不用其用了不同的压缩算法。


在PHP中设置分布式memcache存取
1. 创建对象
$mem = new Memcache();
2. 添加服务
$mem->addServer("192.168.150.250",11211);
$mem->addServer("192.168.150.138",11211);
$mem->addServer("192.168.112.128",11211);
3. 放置信息
$mem->add("mystr","hello memcache!",MEMCACHE_COMPRESSED,0);
$mem->add("myarray",array(10,20,30,40),MEMCACHE_COMPRESSED,0);
$mem->add("myob",new Stu(),MEMCACHE_COMPRESSED,0);
4. 获取信息
echo $mem->get("mystr")."<br/>";
var_dump($mem->get('myarray'));
echo "<br/>";
$mem->get("myob")->getinfo();


memcached服务器的安全防护
• 1. 内网访问
– memcached -d -m 1024 -u root –l 192.168.0.10 –p 11211 –c 1024 start
• 2. 设置防火墙
– iptables –F
– iptables –P INPUT DROP
– iptables –A INPUT –p tcp –s 192.168.0.10 –-dport 11211 –j ACCEPT
– iptables –A INPUT –p udp –s 192.168.0.10 –-dport 11211 –j ACCEPT

优惠券
广告位-淘宝
最新微语