كيفية تمرير محتوى الحوض الصغير متغير أمر خارجي في بي?
سؤال
لدي متغير يحتوي على سلسلة طويلة.(على وجه التحديد أنه يحتوي على بضعة كيلو بايت من جافا سكريبت رمز)
أريد أن تمرير هذه السلسلة الحوض أمر خارجي ، في هذه الحالة جافا سكريبت ضاغط ، والتقاط إخراج الأمر الخارجي (جافا سكريبت مضغوط) في فب ، وتعيينه إلى متغير.
وأنا أدرك أن هناك فئات لضغط جافا سكريبت في فب ، ولكن هذا هو مجرد مثال واحد من مشكلة عامة.
في الأصل استخدمنا:
$newvar = passthru("echo $oldvar | compressor");
هذا يعمل مع السلاسل الصغيرة ، لكنه غير آمن.(إذا كان أولدفار يحتوي على أحرف ذات معنى خاص للقذيفة ، فيمكن أن يحدث أي شيء)
الهروب مع إسكابيشيلارغ إصلاحات ذلك ، ولكن الحل يكسر لسلاسل أطول ، بسبب أوس القيود على الحد الأقصى المسموح به وسيطة طول.
حاولت استخدام popen("command" "w")
والكتابة إلى الأمر-هذا يعمل ، لكن الإخراج من الأمر يختفي بصمت في الفراغ.
من الناحية المفاهيمية ، أريد فقط أن أفعل ما يعادل:
$newvar = external_command($oldvar);
المحلول
باستخدام بروك_فتح- وظيفة يمكنك الحصول على مقابض لكل من ستدوت و ستدين من العملية وبالتالي كتابة البيانات الخاصة بك إليها وقراءة النتيجة.
نصائح أخرى
باستخدام اقتراح رامبلز ، وكنت قادرا على الجهاز الحل التالي الذي يبدو أن تعمل بشكل جيد.نشرها هنا لصالح أي شخص آخر مهتم بالسؤال.
public static function extFilter($command, $content){
$fds = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($command, $fds, $pipes, NULL, NULL);
if (is_resource($process)) {
fwrite($pipes[0], $content);
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$return_value = proc_close($process);
// Do whatever you want to do with $stderr and the commands exit-code.
} else {
// Do whatever you want to do if the command fails to start
}
return $stdout;
}
قد تكون هناك مشاكل الجمود:إذا كانت البيانات التي ترسلها أكبر من الأحجام مجتمعة من الأنابيب ، ثم الأمر الخارجي سوف تمنع ، في انتظار شخص ما لقراءة من انها ستدوت ، في حين يتم حظر فب ، في انتظار ستدين ليتم قراءتها من لإفساح المجال لمزيد من المدخلات.
ربما فب يعتني بهذه المسألة بطريقة أو بأخرى ، ولكن الأمر يستحق اختبار ما إذا كنت تخطط لإرسال (أو تلقي) المزيد من البيانات من يناسب في الأنابيب.