rpc — ошибка класса 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 & Я получаю этот результат
введите описание изображения здесь

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

Отладка после $_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
)

2

Решение

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

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

Различия между добавлять а также Начните Метод, это способ получения идентификатора торрента. В то время как Добавить метод использовать идентификатор торрента, возвращаемый 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"]}}
)

)

Если идентификатор, который вы передаете, был целым числом, [Содержание] должно быть { «Идентификаторы»: [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] на строковое значение.

2

Другие решения

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

Автор: исправление ошибок

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector