Передача сообщений об ошибках в PHP классе
Я бы использовал Этот класс , который позволяет использовать программное обеспечение передачи с php, но я не могу использовать действия отдельно!
<?php
require_once( dirname( __FILE__ ) . '/TransmissionRPC.class.php' );
$test_torrent = "http://www.slackware.com/torrents/slackware64-13.1-install-dvd.torrent";
$rpc = new TransmissionRPC();
$rpc->sstats( );
if (isset($_GET['add']))
{
    try
    { 
      $result = $rpc->add( $test_torrent, '/tmp' );
      $id = $result->arguments->torrent_added->id;
      print "ADD TORRENT TEST... [{$result->result}] (id=$id)n";
      sleep( 2 );
      $rpc->stop( $id );
    } catch (Exception $e) {
      die('[ERROR] ' . $e->getMessage() . PHP_EOL);
    } 
}
if (isset($_GET['start']))
{
    try
    {  
      $rpc->start( $_GET['start'] );
    } catch (Exception $e) {
      die('[ERROR] ' . $e->getMessage() . PHP_EOL);
    } 
}
Первое действие после добавления торрента выполняется (чтобы остановить торрент), но я не могу перезапустить ....
Редактировать для @aergistal & @Miguel:
Когда я вызываю test2.php?add, я получаю этот результат
Итак, я вызываю test2.php?start=1 и получаю этот результат
 
TRANSMISSIONRPC_DEBUG:: request( method=torrent-start, ...):: Stream context created with options:
Array
(
    [http] => Array
        (
            [user_agent] => TransmissionRPC for PHP/0.3
            [ignore_errors] => 1
            [method] => POST
            [header] => Content-type: application/json
X-Transmission-Session-Id: 4C3KBYhu79SVvFcXrrG4RmpFLZaGu54RSLHT0hFqeVEmAmlV
            [content] => {"method":"torrent-start","arguments":{"ids":["1"]}}
        )
)
TRANSMISSIONRPC_DEBUG:: request( method=torrent-start, ...):: POST Result: 
{"arguments":{},"result":"success"}
TRANSMISSIONRPC_DEBUG:: request( method=torrent-start, ...):: Stream meta info: 
Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.0 200 OK
            [1] => Server: Transmission
            [2] => Content-Type: application/json; charset=UTF-8
        )
    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 0
    [seekable] => 
    [uri] => http://localhost:9091/transmission/rpc
    [timed_out] => 
    [blocked] => 1
    [eof] => 1
)
2 ответа:
Я думаю, что проблема заключается в $_GET ['начать'] значение id. Когда вы извлекаете значение, вы всегда будете извлекать его Как строку .
// for index.php?start=1 var_dump($_GET['start'); // will ouput string(1) "1"Разница между методомadd и методомstart заключается в том , как вы получаете ID torrent. В то время как Add method использует идентификатор торрента, возвращаемый torrent api (это целочисленный тип), вы используете string для start method.
Вы можете проверить это в выходные данные отладки, которые вы опубликовали:
TRANSMISSIONRPC_DEBUG:: request (method=torrent-start,...):: Контекст потока, созданный с помощью опций:
Array ( [http] => Array ( [user_agent] => TransmissionRPC for PHP/0.3 [ignore_errors] => 1 [method] => POST [header] => Content-type: application/json X-Transmission-Session-Id: 4C3KBYhu79SVvFcXrrG4RmpFLZaGu54RSLHT0hFqeVEmAmlV [content] => {"method":"torrent-start","arguments":{"ids":["1"]}} ) )Если идентификатор, который вы передаете, был целым числом, то [content] должен быть {"ids":[1]}. Вы можете решить эту задачу, приведя входной идентификатор из строки в целое число .
Бонус: почему кастинг в TransmissionRPC.класс.php не работает?
Класс должен привести от строки к целому числу, но когда вы входите в класс, там есть метод, который должен делать это, но делать это неправильно. Метод называется cleanRequestData.
Это код:
Первый взгляд на это кажется прекрасным, но если вы посмотрите на детали, вы можете увидеть, что весь IF будет оцениваться последовательно. Итак, при приведении от строки к целому числу:protected function cleanRequestData ( $array ) { if ( !is_array( $array ) || count( $array ) == 0 ) return null; // Nothing to clean setlocale( LC_NUMERIC, 'en_US.utf8' ); // Override the locale - if the system locale is wrong, then 12.34 will encode as 12,34 which is invalid JSON foreach ( $array as $index => $value ) { if( is_object( $value ) ) $array[$index] = $value->toArray(); // Convert objects to arrays so they can be JSON encoded if( is_array( $value ) ) $array[$index] = $this->cleanRequestData( $value ); // Recursion if( empty( $value ) && $value != 0 ) unset( $array[$index] ); // Remove empty members if( is_numeric( $value ) ) $array[$index] = $value+0; // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc) if( is_bool( $value ) ) $array[$index] = ( $value ? 1 : 0); // Store boolean values as 0 or 1 if( is_string( $value ) ) $array[$index] = utf8_encode( $value ); // Make sure all data is UTF-8 encoded for Transmission } return $array; }if( is_numeric( $value ) ) $array[$index] = $value+0; // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc)Вы модифицируете массив, Не переменная $value . Таким образом, это означает, что когда вы оцениваете, является ли $value строкой, конечно, это это:
if( is_string( $value ) ) $array[$index] = utf8_encode( $value ); // Make sure all data is UTF-8 encoded for TransmissionИтак, вы вводите здесь, а затем заменяете целочисленный элемент массива $ array[$index] на строковое значение.
Это может быть решением, но, скорее всего, причина более сложна. Ну что ж, посмотрим.
Я изменил код, так что новый торрент приостанавливается при новом добавлении. И поэтому нет необходимости останавливать его. Затем я добавляю код для "отладки" того, что этот класс может видеть, поэтому вызов вашего сайта сtest2.php?list=1должен печатать торренты, которые у него есть. Как ни странно, я не вижу причин, по которым исходный код не должен работать.<?php require_once(dirname(__FILE__) . '/TransmissionRPC.class.php'); $test_torrent = "http://www.slackware.com/torrents/slackware64-13.1-install-dvd.torrent"; $rpc = new TransmissionRPC(); $rpc->sstats(); if (isset($_GET['add'])) { try { $result = $rpc->add_file($test_torrent, '/tmp', array('paused' => true)); $id = $result->arguments->torrent_added->id; print "ADD TORRENT TEST... [{$result->result}] (id=$id)\n"; //sleep(2); //$rpc->stop($id); } catch (Exception $e) { die('[ERROR] ' . $e->getMessage() . PHP_EOL); } } if (isset($_GET['start'])) { try { echo '<pre>'; print_r($rpc->start($_GET['start'])); echo '</pre>'; } catch (Exception $e) { die('[ERROR] ' . $e->getMessage() . PHP_EOL); } } //might be interesting to check what torrents you have if (isset($_GET['list'])) { try { echo '<pre>'; print_r($rpc->get()); echo '</pre>'; } catch (Exception $e) { die('[ERROR] ' . $e->getMessage() . PHP_EOL); } }По atmoner: исправление ошибок bug
