ďťż
Podstrony
|
telcocafeWitam, piszę stronę, która opiera się na połączeniach z serwerami unixowymi.Mam do tego taką klasę, którą troszke przerobiłem: <?php class shell2 { var $conn; var $error; var $stream; function login($user,$pass,$host,$port=22) { if ($this->connect($host,$port)) { if($this->auth($user,$pass)) return 1; else return 0; } else return 0; } function connect($host,$port=22) { if ($this->conn=ssh2_connect($host, $port)) { return 1; } else { $this->error="[x] Can not connected to $host $port"; return 0; } } function auth($u,$p) { if (@ssh2_auth_password($this->conn, $u, $p)) { usleep(500000); return 1; } else { $this->error="Invalid login"; return 0; } } function send($localFile,$remoteFile,$permision) { if (@ssh2_scp_send($this->conn, $localFile, $remoteFile, $permision)) { return 1; } else { $this->error="Can not transfer file"; return 0; } } function get($remoteFile,$localFile) { if (@ssh2_scp_recv($this->conn, $remoteFile, $localFile)) { } } function get_error() { return $this->error; } function exec_cmd($cmd, $new = false) { if($new) $this->stream = null; $this->stream = ssh2_exec($this->conn, $cmd.PHP_EOL); stream_set_blocking($this->stream,true); } function disconnect() { fclose($this->stream); } function get_output() { $r = stream_get_contents($this->stream); stream_set_blocking($this->stream,false); return $r; } } ?> Kiedy mam taki kod, output jest ładnie zwracany (choć nie zawsze, ale w 90% przypadków) jednak po kilku przejściach po podstronach, gdzie wykonuje jakieś operacje za pomocą ssh zaraz wszystko się zawiesza (ładuje w nieskończoność) i musze dawać restart serwera (linuksowy lampp). Kiedy wywalę z funkcji exec_cmd: $output = ""; $start_time = time(); $max_time = 4; while(true) { $line = fread($this->stream, 2048); //get the next line of output if(time() > $start_time+$max_time || eregi('-ENDC-', $output)) break; if(isset($line) && $line != "") $output .= $line; //return only last line (.= for all lines)*/ } str_replace('-ENDC-', '', $data); return $output; To niby wszystko jest ok, tylko, że zwraca cokolwiek raz na 10 odświeżeń strony, nawet kiedy maksymalny czas ustawię na 30 sekund (komenda się wykonuje ale nie zwraca wyniku konsoli). Co można z tym zrobić? Jeżeli nie opisałem wszystkiego dokładnie, to piszcie :) pozdrawiam Użytkownik PiKey edytował ten post 05 listopad 2009, 14:41 Na prawdę nikt nie wie co można z tym zrobić? Myślałem nad zainstalowaniem ubuntu 9.04, gdyż na nim nie było żadnych problemów ;) Teraz 9.10 tylko przeszkadza Pomocy :)) PHP + SSH? trochę niezbyt bezpieczne połączenie. A problemy z bezstanowym kodem zawsze będą - HTTP jest bezstanowy - żądasz stronę i ją dostajesz, a w przypadku połączenia sieciowego masz stałe połączenie (+/- wątki i pętla zdarzeń). Gdy np. połączenie zostanie stracone (bez jawnego rozłączenia dla klienta) to może ci zacząć to wisieć i trzeba zabić proces serwera żeby porzucił takie martwe połączenie. Do tego oczywiście możliwe są liczne inne przypadki pewnie ;) hmmm, więc samo fclose($this->conn); nie wystarcza? Nie wiem czy bym chciał stawiać całą strone na ajaxie, żeby ciągle było ustanowione jedno połączenie, z resztą jakby ktoś włączył kilka podstron na kilku zakładkach już mogłoby się wyszstko posypać... Jeżeli ktoś ma jakieś pomysły to są bardzo mile widziane :) temat ciągle aktualny Pozdrawiam @edit ssh2_disconnect() też nie załatwia sprawy :( Użytkownik PiKey edytował ten post 06 listopad 2009, 22:51 |
|||
Sitedesign by AltusUmbrae. |