Php 如何在不同的时间用相同的sha1sum重新创建PHAR文件?

Php 如何在不同的时间用相同的sha1sum重新创建PHAR文件?,php,phar,Php,Phar,我正在从事一个命令行PHP项目,希望能够重新创建PHAR文件,这是我的部署工件。挑战在于,我无法创建两个具有相同sha1sums且彼此相隔1秒以上的PHAR。如果输入文件相同(即来自同一git提交),我希望能够准确地重新创建我的PHAR文件 以下代码片段演示了该问题: #!/usr/bin/php <?php $hashes = array(); $file_names = array('file1.phar','file2.phar'); foreach ($file_names as

我正在从事一个命令行PHP项目,希望能够重新创建PHAR文件,这是我的部署工件。挑战在于,我无法创建两个具有相同sha1sums且彼此相隔1秒以上的PHAR。如果输入文件相同(即来自同一git提交),我希望能够准确地重新创建我的PHAR文件

以下代码片段演示了该问题:

#!/usr/bin/php
<?php
$hashes = array();
$file_names = array('file1.phar','file2.phar');

foreach ($file_names as $name) {
  if (file_exists($name)) {
    unlink($name);
  }
  $phar = new Phar($name);
  $phar->addFromString('cli.php', "cli\n");
  $hashes[]=sha1_file($name);
  // remove the sleep and the PHAR's are identical.
  sleep(1);
}
if ($hashes[0]==$hashes[1]) {
  echo "match\n";
} else {
  echo "do not match\n";
}
我在ubuntu trusty上用PHP5.5.9运行了上述代码,在RHEL5上用PHP5.3运行了上述代码,两个版本的行为方式相同,无法创建相同的PHAR文件

我这样做是为了遵循Jez Humble和David Farley在《持续部署》一书中的建议


感谢您的帮助。

Phar类目前不允许用户更改甚至访问修改的时间。我曾想过将字符串存储到一个临时文件中,并使用
touch
更改mtime,但这似乎没有任何效果。因此,您必须手动更改所创建文件中的时间戳,然后重新生成存档签名。以下是如何使用当前的PHP版本:


更改系统时间。更改生产服务器甚至开发服务器上的时间是非常不可取的。即使您在系统时间上花费了大量的时间,但是如果构建过程花费的时间比最初运行的时间多或少,那么PHAR文件可能仍然不同。更不用说,如果系统时钟与世界上其他时间相差甚远,某些网络操作(如使用kerberos的网络操作)将失败。更改单个命令的“系统时间”是可行的,但我知道有一种方法可以做到这一点,而且更改单个命令的“系统时间”是困难的,但可行。我不知道如何更改单个可执行文件/命令的系统时间。据我所知,gettimeofday()是一个不能被LD_PRELOAD拦截的内核调用。如果我达到这一水平,那么更改PHP源代码或某种类型的后处理似乎更合理。关于通过LD_PRELOAD更改单个程序的系统时间,我的观点是正确的。可以使用更改一些进程的系统时间。我之所以迟迟不肯为一个进程破解系统,很大程度上是因为我努力编写了自己的库,但这已经完成了。谢谢你。我对它进行了测试,它适用于我的原始代码示例,但如果存在存根,它就会失败
createDefaultStub()
在编译器停止后添加“\r\n”。使用
$magic=“\uuu HALT\u COMPILER();?”。“>\r\n”使存根案例的工作正常。
touch(): Can not call touch() for a non-standard stream