Php file_exists在file_put_内容(或fwrite)和第二次执行中取消链接之间返回false

Php file_exists在file_put_内容(或fwrite)和第二次执行中取消链接之间返回false,php,Php,我在一个cron系统上工作,一次只需要执行一次脚本。通过使用以下代码,我第一次执行脚本,当它循环时(为了延迟),再次执行它,但file_exists始终返回false,而第一次执行在循环完成后返回文件内容 Cronjob.php: include "Locker.class.php"; Locker::$LockName = __DIR__.'/OneTime_[cron].lock'; $Locker = new Locker(); for ($i = 0 ; $i < 100000

我在一个cron系统上工作,一次只需要执行一次脚本。通过使用以下代码,我第一次执行脚本,当它循环时(为了延迟),再次执行它,但file_exists始终返回false,而第一次执行在循环完成后返回文件内容

Cronjob.php:

include "Locker.class.php";

Locker::$LockName = __DIR__.'/OneTime_[cron].lock';
$Locker = new Locker();

for ($i = 0 ; $i < 1000000; $i++){
    echo 'Z';
    $z = true;
    ob_end_flush();
    ob_start();
}

有什么问题?为什么file_exists总是返回false?

我怀疑PHP解析器注意到您从未使用变量
$Locker
,因此它会立即销毁对象,从而运行析构函数并删除文件。尝试在循环后放置对对象的引用:

include "Locker.class.php";

Locker::$LockName = __DIR__.'/OneTime_[cron].lock';
$Locker = new Locker();

for ($i = 0 ; $i < 1000000; $i++){
    echo 'Z';
    $z = true;
    ob_end_flush();
    ob_start();
}

var_dump($Locker);
包括“Locker.class.php”;
Locker::$LockName=\uuuuu DIR\uuuu.'/OneTime\uuu[cron].lock';
$Locker=新储物柜();
对于($i=0;$i<1000000;$i++){
回声“Z”;
$z=真;
ob_end_flush();
ob_start();
}
var_dump($储物柜);

如果您的目标是防止一个可能长时间运行的作业同时执行多个副本,则可以采取更简单的方法,只需执行文件本身

这将进入
cronjob.php

<?php

$wb = false;
$fp = fopen(__FILE__, 'r');
if (!$fp) die("Could not open file");

$locked = flock($fp, LOCK_EX | LOCK_NB, $wb);

if (!$locked) die("Couldn't acquire lock!\n");

// do work here
sleep(20);

flock($fp, LOCK_UN);
fclose($fp);

运行脚本时,是否可以看到正在创建的文件?运行脚本的用户是否具有正确的权限?尝试编写另一个脚本,该脚本使用
是可写的(\uuu文件\uuu)
并检查PHP是否可以写入目录。@Daniel User具有正确的权限,但当文件在循环中时,我看不到该文件。但通过更改循环代码来输出文件的内容,它确实输出了文件,但文件仍然不存在。我想文件不知怎么锁上了!我试过你的建议,但没有结果。即使没有最后一个var_转储,对象也会被成功销毁,因为它的输出在循环内容之后。比如:
ZZZZ……ZZZZ让它保持活力
<?php

$wb = false;
$fp = fopen(__FILE__, 'r');
if (!$fp) die("Could not open file");

$locked = flock($fp, LOCK_EX | LOCK_NB, $wb);

if (!$locked) die("Couldn't acquire lock!\n");

// do work here
sleep(20);

flock($fp, LOCK_UN);
fclose($fp);