Я работаю над проектом PHP из командной строки и хочу иметь возможность воссоздать файл PHAR, который является моим артефактом развертывания. Проблема состоит в том, что я не могу создать два PHAR, которые имеют идентичные sha1sums и были созданы более чем на 1 секунду друг от друга. Я хотел бы иметь возможность точно воссоздать мой PHAR-файл, если входные файлы одинаковы (т. Е. Из одного и того же git-коммита).Как воссоздать файлы PHAR с идентичными sha1sums в разное время?
Следующий фрагмент кода демонстрирует проблему:
#!/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";
}
Насколько я могу сказать, поле «время модификации» для каждого файла в манифесте PHAR всегда устанавливается в текущее время, и кажется, никоим образом не нарушать этого. Даже touch("phar://file1.phar/cli.php", 1413387555)
выдает ошибку:
touch(): Can not call touch() for a non-standard stream
Я побежал выше код в PHP 5.5.9 на Ubuntu велеречивого и PHP 5.3 на RHEL5 и обе версии ведут себя так же, как и не создавать одинаковые файлы ФАРЫ.
Я пытаюсь сделать это для того, чтобы следовать советам в книге Continuous Deployment по Jez Humble и David Фарли
Любая помощь приветствуется.
Изменение системного времени. –
Очень нежелательно менять время на производстве или даже на серверах разработки. Даже если вы забиваете системное время, тогда файлы PHAR могут по-прежнему отличаться, если процесс сборки занимает больше или меньше времени, чем исходный запуск. Не говоря уже о том, что некоторые сетевые операции, например, с kerberos, потерпят неудачу, если системные часы значительно отличаются от остального времени в мире. Изменение «системного времени» для одной команды было бы работоспособным, но я знаю, как это сделать, и это wo – edgester
Изменение «системного времени» для одной команды будет kludgey, но работоспособным. Я не знаю, как изменить системное время для одного исполняемого файла/команды. Как я понимаю, gettimeofday() - это вызов ядра, который не может быть перехвачен LD_PRELOAD. Если бы я пошел на этот уровень усилий, то изменение исходного кода PHP или некоторый тип пост-обработки кажется более разумным. – edgester