Я полагаю, что это - потому что JPEG, с которым Вы работаете, является прогрессивным JPEG, который имеет различный тип пантомимы.
В linux вы бы посмотрели на /proc.[1252pting, в Windows вы могли бы shell_exec () tasklist.exe, и это обнаружило бы соответствующий идентификатор процесса:
$processes = explode( "\n", shell_exec( "tasklist.exe" ));
foreach( $processes as $process )
{
if( strpos( "Image Name", $process ) === 0
|| strpos( "===", $process ) === 0 )
continue;
$matches = false;
preg_match( "/(.*?)\s+(\d+).*$/", $process, $matches );
$pid = $matches[ 2 ];
}
Я считаю, что вы хотите сохранить PID файл. В написанных мною демонах они проверяют файл конфигурации, ищут экземпляр файла pid, извлекают pid из файла pid, проверяют, существует ли / proc / $ pid, а если нет, удаляют pid файл.
if( file_exists("/tmp/daemon.pid"))
{
$pid = file_get_contents( "/tmp/daemon.pid" );
if( file_exists( "/proc/$pid" ))
{
error_log( "found a running instance, exiting.");
exit(1);
}
else
{
error_log( "previous process exited without cleaning pidfile, removing" );
unlink( "/tmp/daemon.pid" );
}
}
$h = fopen("/tmp/daemon.pid", 'w');
if( $h ) fwrite( $h, getmypid() );
fclose( $h );
Идентификаторы процесса предоставляются ОС, и нельзя зарезервировать идентификатор процесса. Вы бы написали, что ваш демон уважает файл pid.
Лучшим способом добиться этого было бы использование pid или файла блокировки. Просто проверьте наличие файла pid, создайте его по мере необходимости и заполните его текущим pid.
<?
class pidfile {
private $_file;
private $_running;
public function __construct($dir, $name) {
$this->_file = "$dir/$name.pid";
if (file_exists($this->_file)) {
$pid = trim(file_get_contents($this->_file));
if (posix_kill($pid, 0)) {
$this->_running = true;
}
}
if (! $this->_running) {
$pid = getmypid();
file_put_contents($this->_file, $pid);
}
}
public function __destruct() {
if ((! $this->_running) && file_exists($this->_file)) {
unlink($this->_file);
}
}
public function is_already_running() {
return $this->_running;
}
}
?>
И используйте его следующим образом:
<?
$pidfile = new pidfile('/tmp', 'myscript');
if($pidfile->is_already_running()) {
echo "Already running.\n";
exit;
} else {
echo "Started...\n";
}
?>
Здесь не так много проверки ошибок, но быстрый запуск показывает, что это работает. моя система.
Нет, вы не можете изменить идентификатор процесса. Он назначается ядром и является частью структур данных ядра
Не забывайте также, что вы можете получить доступ к командам оболочки через обратные кавычки (`), что даст вам доступ к стандартным инструментам * nix для работы с pid.
источник: http://www.php.net/manual/en/language.operators.execution.php
Как говорили другие, вы не можете изменить идентификатор процесса - он назначается и полностью управляется ядром ОС. Кроме того, вы не указали, используется ли это в командной строке или на веб-сервере: если последнее, возможно, вы даже не получаете pid своего скрипта.
Страница руководства для getmypid () содержит несколько примеров «оптимистической» блокировки. Я использую слово optimisitc, поскольку PHP никогда не приблизится к подобным веб-приложениям asp.net, где у вас есть настоящая многопоточная среда с общими / статическими классами и, следовательно, синглтоны для использования / злоупотребления. Обычно у вас есть возможность:
Оба они полагаются на правильное завершение сценария (поскольку последним шагом будет удаление флага файла блокировки / базы данных). Если по какой-либо причине происходит сбой сценария (или самого компьютера), вам может потребоваться ручная очистка для удаления флага. Для этого нет простого решения, но можно было бы изучить один из способов - затем взглянуть на отметку даты на блокировке с помощью произвольного подхода «если старше X, последний запуск должен был дать сбой».
Если по какой-либо причине происходит сбой сценария (или самого компьютера), вам может потребоваться ручная очистка, чтобы удалить флаг. Для этого нет простого решения, но можно было бы изучить один из способов - затем взглянуть на отметку даты на блокировке с помощью произвольного подхода «если старше X, последний запуск должен был дать сбой». Если по какой-либо причине происходит сбой сценария (или самого компьютера), вам может потребоваться ручная очистка, чтобы удалить флаг. Для этого нет простого решения, но можно было бы изучить один из способов - затем взглянуть на отметку даты на блокировке с помощью произвольного подхода «если старше X, последний запуск должен был дать сбой».