WebHU - Programozási kérdések és válaszok

STDOUT olvasása az aria2c-ből PHP szkriptben

Íme egy egyszerű PHP szkript:

<?php
is_resource($process = proc_open('aria2c http://speedtest.rinet.ru/file100m.dat',  [
   ['pipe', 'r'],
   ['pipe', 'w'],
   ['file', '/tmp/error-output.txt', 'a']
], $pipes, '/tmp', [])) || die();
fclose($pipes[0]);
fpassthru($pipes[1]);
fclose($pipes[1]);
proc_close($process);

A probléma az, hogy a kimenetben lévő folyamatadatok leállnak, amíg az aria2c be nem fejeződik. Amikor az aria2c folyamat véget ér, azonnal kitörli az összes kimenetet a szkriptembe. Nem kapcsolódik az fpassthru()-hoz, kipróbáltam a sima fread()-t, ugyanazzal az eredménnyel.

Az áramlás:

[FIGYELMEZTETÉS] A fájl már létezik. Átnevezve erre: /tmp/file100m.dat.4.

‹...nagy késés, majd szétrobban...›

[#edb1dc 70MiB/100MiB(70%) CN:1 DL:8.4MiB ETA:3s]

[#edb1dc 81MiB/100MiB(81%) CN:1 DL:9.7MiB ETA:1s]

[#edb1dc 92MiB/100MiB(92%) CN:1 DL:10MiB]

Olyan sorokat kell beszereznem, mint [#edb1dc 92MiB/100MiB(92%) CN:1 DL:10MiB] anélkül, hogy meg kellene várnom az aria2c végét, hogy információkat gyűjtsek az aktuális folyamatról.

Arról nem is beszélve, hogy ha pontosan ugyanazt a parancsot futtatom a konzolban, az aria2c jól működik.

21.12.2013

  • Találtál megoldást erre a problémára? 24.04.2014
  • Dehogy. Más szoftvert használt. 24.04.2014

Válaszok:


1

Ugyanebbe a problémába ütköztem, miközben próbáltam figyelni az Aria2 letöltési folyamatát (kiolvasását) a PHP-ből.

A problémát egy hiányzó fflush(stdout) okozza az Aria2 kódban, de szerencsére van egy javítás, amelyet a PHP kódban használhat az STDOUT pufferelési mód újrakonfigurálására. Használhatja a stdbuf segédprogramot Linux alatt vagy a unbuffer segédprogramot OSX alatt a pufferelés letiltásához, így:

proc_open('stdbuf -o0 aria2c ...'); // on Linux

or:

proc_open('unbuffer aria2c ...'); // on OSX

(Köszönjük @hek2mgl-nek ezt a választ egy másik hasonló kérdésre)

30.06.2014
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..