1、逐行读取文件,如果一个文件非常大,甚至超过了你服务器的内存限制,那么按行读取文件是一个不错的选择,代码如下:

<?php
$handle = @fopen("/tmp/file.txt", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer;
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}

2、goto,也许做php开发很多年的同学都不知道这个语法,他代表跳转到指定代码段,比如在执行循环的时候循环体内发生异常,我们希望重新执行当次循环的代码逻辑,就可以结合goto来使用:

<?php
foreach ($data as $row) {
        try {
            trans:
            //这里是你的代码逻辑
        } catch (Exception $e) {
            echo $e->getMessage(),"\n";
            goto trans;
        }
}

3、php脚本实现多进程,我们在实际开发需求当中免不了使用多进程来处理业务,比如一个亿级的数据表,我们用php脚本来分析这个表的数据,就应该启用多进程可以大大提高效率,pcntl_fork是实现多进程的核心方法:

<?php

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
    //错误处理:创建子进程失败时返回-1.
     die('could not fork');
} else if ($pid) {
     //父进程会得到子进程号,所以这里是父进程执行的逻辑
     pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
     //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

4、php生成器yield,yield可是php性能利器,言简意赅的来总结它就是“随用随取”,下面通过例子来讲解:

<?php
//未使用生成器的例子
function createData($number){
    $data = array();
    for($i=0;$i<$number;$i++){
        $data[] = time();
    }
    return $data;
}
$datas = createData(100000000);
foreach($datas as $row){
    //这里是代码逻辑,内存占开销很大,存储了数组里的所有数据
}
//使用生成器的例子
function createDataByYield($number){     
    for($i=0;$i<$number;$i++){        
        yield time();     
    } 
}
$arr = createDataByYield(100000000);
foreach($arr as $row){
    //这里是代码逻辑,内存占用开销只有1条数据
}

在上面的例子中createData方法返回的数组中如果有上千万甚至上亿条数据,会给服务器内存带来很大的开销,而使用生成器yield的例子中,我们只需要循环createDataByYield方法来获取每一条数据来处理即可,当前服务器内存只有一条数据的开销。

5、php捕获错误,在php开发过程中我们一般都是用try catch来捕获异常,但是如果程序出现Fatal error的错误就会终止运行,在某些业务场景下我们可能不希望程序停止运行,就需要能捕获这类错误,在php7中新增了Throwable 接口来捕获错误,可以通过 try {} catch(Throwable $e) 来捕获php中无法捕获到的错误:

<?php
try {
    //这里可以写一些Fatal error的代码逻辑
} catch (Throwable $e) {
    echo $e->getMessage();
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注