ugrás a tartalomhoz

Adat beolvasása STDIN-ről PHP-vel

Anonymous · 2005. Nov. 30. (Sze), 13.49
Üdv!

Olyan kérdésem lenne, hogy miképp' lehet rávenni az fread() függvényt, hogy STDIN-ről végig olvassa a file/stream-et (esetleg más függvény is jöhet)?

A gondom, hogy Freebsd alatt jól működő program linux-on nem akar működni.

A pontos működési menet az lenne, hogy egy program meghívja CLI-s php alkalmazást és a STDIN-ra küld szöveget.
BSD-ben ezt a php be is olvasta, de linux-on csak az első sorig hajlandó menni. (A max byte nem lehet gond)

ue. az alkalmazásnak argv.-ként megadva a lemenetett szöveget sikerül végig olvasnia, de STDIN-putról már nem.

Gondolom "ludas" a program is, ami átadja (ua. mint BSD-n), de nem lehet vhogy kikényszeríteni a php-t (fread()-et?), hogy tovább olvasson?
Gondoltam a sortörés CR-LF problémára, de nem tudom, azt hogy lehetne átállítani. Elvileg mind2 Unix, v. mi a szösz:-)


Így lenne beolvasva:

<?php
$information = fread(STDIN, 3048576);
?>
És az $information csak 1 sort tartalmaz....

Köszönöm
 
1

PHP != C++

Anonymous · 2005. Nov. 30. (Sze), 20.35
Üdv!

A PHP jellegéből adódóan nem alkalmas STDINről való olvasásra, mert batch és legfőképpen webes nyelvnek készült. Szvsz írj egy C programot, ami leszedi az STDINről az adatot, lementi egy fájlba, amit a PHP program kiolvas.

Esetleg, ha ennél a megoldásnál maradsz, próbáld meg az fgets() fv-t.

A PHP doksiban találtam ezt a kódot:

$stdin = fopen('php://stdin', 'r');

Asszem 4.3.0-s php előtti verzióknál kell.
4

megvan:-)

Anonymous · 2005. Dec. 1. (Cs), 16.03
Visszavonom az előzőt, a "$stdin = fopen('php://stdin', 'r');"-val sikerült, STDIN-el nem (???), pedig 4.3.0 utáni php van fent...

Úgynéz ki így műxik.

Köszönöm a segítséget.
2

Ciklikusan olvasd be

Török Gábor · 2005. Dec. 1. (Cs), 10.00
Ciklikusan kell beolvasnod az adatot az STDIN-ről.

<?php
$line = "";
if ($fp = fopen('php://stdin', 'r')) {
  while (!feof($fp)) {
    $line .= fread($fp, 8192);
  }
  fclose($fp);
}
print $line;
Itt vannak hasznos leírások:

A probléma pedig valószínűleg ez lesz:
When reading from network streams or pipes, such as those returned when reading remote files or from popen() and fsockopen(), reading will stop after a packet is available. This means that you should collect the data together in chunks [...]

(Nálam Linuxon így működik.)
3

fopen

Anonymous · 2005. Dec. 1. (Cs), 15.57
Ez nem működik:-(
"fopen() expects parameter 1 to be string"
5

4.es válasz a listában

Anonymous · 2005. Dec. 1. (Cs), 16.05
Sikerült végülis, csak rossz hozzászólásra válaszoltam...