Reply to proc_open hang (data > 64k)

Your name:

Reply:


Posted by razorfold@gmail.com on 10/26/05 05:59

Hi,

I've written something that takes text and passes it to gpg to encrypt.
It works great except when the text size is greater than 64k at which
point PHP/Apache hangs. Is there any way around this? Below is a code
snippet (which may or may not help).

Thanks,
-r

function encryptContent($fileContent, $encryptionKey)
{
if(!$this->gpgVerify())
{
$this->displayTextInTable('gpgVerify failed!');
exit;
}

$command = '/safeModeExecDir/gpg --homedir /data/.gnupg --armor
--cipher-algo AES256 --passphrase-fd 3 --batch
--no-tty --yes -c';

// set up pipes for handling I/O to/from GnuPG
// 0 === STDIN, a pipe that GnuPG will read the content from
// 1 === STDOUT, a pipe that GnuPG will write the encrypted
content to
// 2 === STDERR, a pipe that GnuPG will write to
// 3 === STDIN, a pipe that GnuPG will read the passphrase from
$descriptorSpec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
3 => array("pipe", "r")
);

$gpgProcess = proc_open($command, $descriptorSpec, $gpgPipes);

if(is_resource($gpgProcess))
{
// this writes $fileContent to GnuPG on STDIN
if(false === fwrite($gpgPipes[0], $fileContent,
strlen($fileContent)))
{
$this->displayTextInTable('fwrite failed!');
exit;
}
fclose($gpgPipes[0]);

// this writes the $encryptionKey to GnuPG on fd 3
fwrite($gpgPipes[3], $encryptionKey);
fclose($gpgPipes[3]);

// this reads the encrypted output from GnuPG from STDOUT
$encryptedContent = '';
while(!feof($gpgPipes[1]))
{
$encryptedContent .= fgets($gpgPipes[1], 1024);
}
fclose($gpgPipes[1]);

// this reads warnings and notices from GnuPG from STDERR
$gpgErrorMessage = '';
while(!feof($gpgPipes[2]))
{
$gpgErrorMessage .= fgets($gpgPipes[2], 1024);
}
fclose($gpgPipes[2]);

// this collects the exit status of GnuPG
$processExitStatus = proc_close($gpgProcess);

// unset variables that are no longer needed
// and can only cause trouble
unset(
$fileContent,
$encryptionKey,
$command,
$descriptorSpec,
$gpgProcess,
$gpgPipes,
$gpgErrorMessage,
$gpgExitStatus
);
}
else
{
$this->displayTextInTable('proc_open() failed.');
exit;
}

return $encryptedContent;
}

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация