سؤال

أنا أستخدم AJAX على موقعي وأرغب في إظهار تقدم المستخدمين في الملف الذي يتم تنزيله بواسطة الخادم الخاص بي.

التحميل يتم عن طريق البرنامج النصي ذلك إخراج نسبة مئوية إلى الصدفة.أرغب في إعادة هذه المعلومات إلى المستخدم الذي يستخدم AJAX.كيف يمكنني أن أفعل هذا؟

شكرا لك على أي مساعدة والتوجيه.

أتمنى ألا تتضمن حلولك الكتابة إلى ملف نصي واسترجاع تلك النسبة من الملف النصي !!أعتقد أن هناك الكثير فوق الرأس.

تحرير - مزيد من المعلومات

إنه أمر Linux Shell - Fedora Core 10.

حاليًا هذا هو الشكل الذي يبدو عليه إخراج الصدفة:

[download]   9.9% of 10.09M at 10.62M/s ETA 00:00

تتغير النسبة المئوية وأرغب في التقاط ذلك وإرسالها مرة أخرى إلى المستخدم عندما تتغير.

لتنفيذ ذلك، أستخدم وظيفة PHPs exec().

هل كانت مفيدة؟

المحلول

بدلاً من exec، يمكنك استخدام بوبين.سيعطيك هذا مقبضًا تستخدمه مع fread للحصول على المخرجات التي ينشئها أمرك فور حدوثها.

ستحتاج إلى تحليل التحديثات التي يجريها على مؤشر النسبة المئوية.بمجرد حصولك على تلك البيانات، هناك عدة طرق يمكنك من خلالها توصيلها إلى العميل، على سبيل المثال.مع "المذنب" دفع النمط، أو إجراء استطلاع طلب Ajax للحصول على التحديثات.

نصائح أخرى

لم أجرب هذا، ولكن أعتقد أن هذا النهج سينجح.

تحتاج إلى ثلاث قطع:

  1. اطلب من برنامج Shell النصي إخراج دفقه إلى netcat المتصل بمنفذ
  2. احصل على برنامج نصي php يستمع إلى التدفق القادم من المنفذ المذكور للبيانات الواردة أو تحديث سجل في ذاكرة التخزين المؤقت أو بعض قواعد البيانات مع النسبة المئوية المنتهية.
  3. اطلب من برنامج الويب الخاص بك إجراء مكالمات Ajax بشكل دوري إلى الخادم الذي يتحقق من هذه القيمة في متجر الواجهة الخلفية لديك.

أنا أعمل على مشكلة مماثلة.لا بد لي من تحليل إخراج البرنامج النصي الخاص بتحويل الفيديو.أنا أستعمل popen وتحليل إخراج عاد resource.في البداية استخدمت fgets لكن ذلك لم يتعرف على القيم المحدثة كخطوط جديدة.لذلك قمت بإنشاء وظيفة بسيطة تتطلب وظيفة اختيارية $arg_delimiter حتى تتمكن من التحقق من أنواع الإرجاع الأخرى مثل chr(13) عودة النقل.تم تعديل رمز المثال قليلاً وبالتالي لم يتم اختباره لأنه في حالتي كانت هذه الوظائف عبارة عن طرق على كائن المحلل اللغوي الخاص بي.

function get_line ($arg_handle, $arg_delimiter = NULL)
{
  $delimiter = (NULL !== $arg_delimiter) ? $arg_delimiter : chr(10);
  $result    = array();

  while ( ! feof($arg_handle))
  {
    $currentCharacter = fgetc($arg_handle);

    if ($delimiter === $currentCharacter)
    {
      return implode('', $result);
    }

    $result[] = $currentCharacter;
  }

  return implode('', $result);
}

أنا ببساطة أكرر النتائج من popen() resource مثله:

  $command = '/usr/bin/yourcommand';
  $handle  = popen($command . ' 2>&1', 'r');

  while ( ! feof($handle))
  {
    $line = get_line($handle, chr(13));

    preg_match($yourParserRegex, $line, $data);

    if (count($data) > 0)
    {
      printf("<script type='text/javascript'>\n  //<![CDATA[\n    window.alert('Result: %s');\n  // ]]>\n</script>"
            ,$data[1]
            );
      flush();
    }

  }

الآن كل ما عليك فعله هو معرفة مكونات المذنب.

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