PHP fread 函数是否阻塞?

fread() 在一般文件是不阻塞的,但是在管道这些特殊文件下会阻塞。

普通文件

if (PHP_SAPI != 'cli') {
    exit('请在 cli 下运行');
}

$file = __DIR__.DIRECTORY_SEPARATOR.'test.txt';

// 创建一个普通文件
if (!file_exists($file)) {
    touch($file);
} else {
    exit('先清除 '.$file);
}

$pid = pcntl_fork();
if ($pid < 0) {
    exit('fork error'.PHP_EOL);
} elseif (0 == $pid) {
    sleep(5);
    $file = fopen($file, "w");
    fwrite($file, "hello world.");
    exit();
} elseif ($pid > 0) {
    $file = fopen($file, "r");
    $content = fread($file, 1024);
    echo $content,PHP_EOL;
    pcntl_wait($status);
}

输出:

$ PHP test.php

执行完成

管道

if (PHP_SAPI != 'cli') {
    exit('请在 cli 下运行');
}

$pipe_file = __DIR__.DIRECTORY_SEPARATOR.'test.pipe';

// 创建一个管道
if (!file_exists($pipe_file)) {
    if (!posix_mkfifo($pipe_file, 0666)) {
        exit('创建管道失败');
    }
}

$pid = pcntl_fork();
if ($pid < 0) {
    exit('fork error'.PHP_EOL);
} elseif (0 == $pid) {
    sleep(5);
    $file = fopen($pipe_file, "w");
    fwrite($file, "hello world.");
    exit();
} elseif ($pid > 0) {
    $file = fopen($pipe_file, "r");
    $content = fread($file, 1024);
    echo $content,PHP_EOL;
    pcntl_wait($status);
    echo "执行完成";
}

输出:

$ PHP test.php
hello world.
执行完成

发表评论