كيفية تمرير محتوى الحوض الصغير متغير أمر خارجي في بي?

StackOverflow https://stackoverflow.com/questions/7331527

  •  27-10-2019
  •  | 
  •  

سؤال

لدي متغير يحتوي على سلسلة طويلة.(على وجه التحديد أنه يحتوي على بضعة كيلو بايت من جافا سكريبت رمز)

أريد أن تمرير هذه السلسلة الحوض أمر خارجي ، في هذه الحالة جافا سكريبت ضاغط ، والتقاط إخراج الأمر الخارجي (جافا سكريبت مضغوط) في فب ، وتعيينه إلى متغير.

وأنا أدرك أن هناك فئات لضغط جافا سكريبت في فب ، ولكن هذا هو مجرد مثال واحد من مشكلة عامة.

في الأصل استخدمنا:

$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;
}

قد تكون هناك مشاكل الجمود:إذا كانت البيانات التي ترسلها أكبر من الأحجام مجتمعة من الأنابيب ، ثم الأمر الخارجي سوف تمنع ، في انتظار شخص ما لقراءة من انها ستدوت ، في حين يتم حظر فب ، في انتظار ستدين ليتم قراءتها من لإفساح المجال لمزيد من المدخلات.

ربما فب يعتني بهذه المسألة بطريقة أو بأخرى ، ولكن الأمر يستحق اختبار ما إذا كنت تخطط لإرسال (أو تلقي) المزيد من البيانات من يناسب في الأنابيب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top