【问题标题】:PHP - How to wait for disk to be written after commit is called?PHP - 如何在调用提交后等待写入磁盘?
【发布时间】:2019-01-03 07:21:59
【问题描述】:

我正在使用 postgresql。我必须在 php 脚本中调用一个 jar 文件,该文件在读取 db 后执行一些操作。

$connection 是一个 PDO。我注意到以下行为:

场景 1:

$connection->commit();

exec_shell(java -jar jarname) //it does not give expected behaviour

场景 2:

$connection->commit();

sleep(60);

exec_shell(java -jar jarname) //it does give expected behaviour

那么,问题来了:如何等到 commit 将所有数据写入磁盘后再继续执行指令?

fsync 在 postgres.conf 中开启 synchronous_commit 在 postgres.conf 中开启

【问题讨论】:

  • 您可以查看文件是否被其他进程锁定。您可以有一个 while 循环来查看文件的最后修改日期。您可以扫描文件以查找文件结束标记。
  • @Scuzzy 似乎不是这里问题的 java 文件的锁定,但是 PDO::commit 在运行 java 文件之前没有将所有数据写入表。如果我理解 OP 正确。
  • 也许你应该修改你的java prog到Consistent Nonlocking Reads

标签: php pdo transactions commit disk


【解决方案1】:

我没有使用 PDO 的经验,但是如果您可以检查提交的结果,则可以 试试这样的:

$commit_status = $connection->commit();
if($commit_status === TRUE)
{
  exec_shell(java -jar jarname)
}

只要你没有来自提交状态的响应,exec_shell 就不会被调用

【讨论】:

  • $connection->commit();给出 1,然后执行 jar 有同样的问题
  • 那个函数返回 1 很快
猜你喜欢
  • 1970-01-01
  • 2020-02-21
  • 2011-02-20
  • 1970-01-01
  • 2014-09-17
  • 2011-12-13
  • 1970-01-01
  • 2023-03-22
  • 2013-08-10
相关资源
最近更新 更多