Ошибка класса 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, я получаю этот результат
add
поэтому я вызываю test2.php?start=1 и получаю этот результат
введите здесь описание изображения

Но результата нет!! Торрент не запускается: введите здесь описание изображения

Отладка после $_GET['start']:
введите здесь описание изображения

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
)

person Julien    schedule 18.11.2015    source источник
comment
Что снова за сообщение об ошибке?   -  person John Doe    schedule 19.11.2015
comment
Нет ошибки... нет ошибки обратно! поток не начинается в передаче. Но если запускаю старт после стопа, то работает! Просто начальное действие не работает   -  person Julien    schedule 19.11.2015
comment
Не могли бы вы показать нам вывод var_dump($_GET['start'] ), когда значение isset($_GET['start'] ) равно true?   -  person Miguel    schedule 24.11.2015
comment
@aergistal я обновил свой пост   -  person Julien    schedule 24.11.2015
comment
@Miguel, я обновил свой пост   -  person Julien    schedule 24.11.2015
comment
включите отладку пожалуйста, $rpc = new TransmissionRPC();$rpc->debug = true;   -  person user5542121    schedule 24.11.2015
comment
@ user5542121 Готово! я добавляю изображение и обычную отладку   -  person Julien    schedule 24.11.2015


Ответы (2)


Я думаю, проблема в значении идентификатора $_GET['start']. Когда вы извлекаете значение, вы всегда извлекаете его как строку.

// for index.php?start=1
var_dump($_GET['start'); // will ouput string(1) "1"

Различие между методами add и start заключается в способе получения идентификатора торрента. В то время как метод добавления использует идентификатор торрента, возвращенный API торрента (это целочисленный тип), вы используете строку для метод запуска.

Вы можете проверить это в опубликованном вами отладочном выводе:

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.class.php не работает?

Класс должен преобразовывать строку из строки в целое число, но когда вы заходите внутрь класса, есть метод, который должен это делать, но делает это неправильно. Метод называется cleanRequestData.

Это код:

  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] строковым значением.

person Miguel    schedule 25.11.2015
comment
Ооо! как сказать....идеально!! если бы я мог, я бы дал вам гораздо больше, чем 100 баллов =) немного терпения и награду, которую я вам даю, как раз в то время, когда я сделал тест - person Julien; 26.11.2015
comment
Рад был вам помочь :-) - person Miguel; 26.11.2015

Это может быть решением, но, скорее всего, причина более сложная. Что ж, посмотрим.
Я изменил код, чтобы новый торрент приостанавливался при новом добавлении. И поэтому нет необходимости его останавливать. Затем я добавляю код для «отладки» того, что может видеть этот класс, поэтому вызов вашего веб-сайта с помощью 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: исправление ошибки ошибки

person user5542121    schedule 24.11.2015
comment
+1 за $_GET['list'], но ваш код не решает мою проблему! это только позволяет мне узнать, какие торренты в настоящее время используются в моем клиенте, мне нужно запускать и останавливать торрент, когда я хочу - person Julien; 24.11.2015
comment
Ну что теперь начнется? - person user5542121; 24.11.2015
comment
Нет! нет запуска при звонке ?start=[id] - person Julien; 24.11.2015
comment
Странно, откуда на самом деле приходит сообщение об успехе? @atmon3r atmon3r Я обновил код, так что мы получили некоторую информацию о запуске.. Надеюсь. Пожалуйста, опубликуйте или прокомментируйте его вывод. - person user5542121; 24.11.2015
comment
Результат вашего обновления: i.imgur.com/XLIm1aU.png, но торрент не запускается ! :/ вот уже три дня пытаюсь понять почему это не работает, у меня всегда получается вот такой результат - person Julien; 24.11.2015
comment
Похоже, вы используете не совсем тот код, который показываете нам. Было бы лучше, если бы он был идентичным. - person user5542121; 24.11.2015
comment
??? это точно такой же код!! Ооо, я не новичок... Это test3.php: pastebin.com/fc13vYC4 - person Julien; 24.11.2015
comment
Если это точно такой же код, откуда в окне вашего браузера появилось сообщение «успех» - мне интересно... извините, просто пытаюсь убедиться, что все на своем месте. Я все равно сегодня уйду.. удачи! - person user5542121; 24.11.2015
comment
Сообщение «успех» приходит отсюда: trac. transferbt.com/browser/branches/1.7x/doc/ ;) - person Julien; 24.11.2015