ダウンロードしたクラスを使用しています。PHPクラスとヘルパーにあまり慣れていないので、投稿して、経験豊富な誰かが私が抱えているエラーについて助けてくれるかどうかを確認することにしました。
これを使用して、スクリプト「torrenttest」で関数を呼び出しています
<?php
require_once 'Torrentmaker.php';
$torrent = new Torrent( 'file', 'http://fr33dom.h33t.com:3310/announce' );
$torrent->announce(array('udp://tracker.openbittorrent.com:80/announce',
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save('test2.torrent'); // save to disk
else
echo '<br>DEBUG: ',$error;
問題は、「ファイル」が同じサーバー上にある場合、正常に機能することです。ただし、遠隔地のサーバーを呼び出すと、タイムアウト エラーが発生するか、サイズのない torrent ファイルが作成されます (実行に失敗します)。
これは Torrentmaker.php のスクリプトです
class Torrent {
public function __construct ( $data = null, $meta = array(), $piece_length = 256 ) {
if ( is_null( $data ) )
return false;
if ( $piece_length < 32 || $piece_length > 4096 )
return self::set_error( new Exception( 'Invalid piece lenth, must be between 32 and 4096' ) );
if ( is_string( $meta ) )
$meta = array( 'announce' => $meta );
if ( $this->build( $data, $piece_length * 1024 ) )
$this->touch();
else
$meta = array_merge( $meta, $this->decode( $data ) );
foreach( $meta as $key => $value )
$this->{$key} = $value;
public function content ( $precision = null ) {
$files = array();
if ( isset( $this->info['files'] ) && is_array( $this->info['files'] ) )
foreach ( $this->info['files'] as $file )
$files[self::path( $file['path'], $this->info['name'] )] = $precision ?
self::format( $file['length'], $precision ) :
$file['length'];
elseif ( isset( $this->info['name'] ) )
$files[$this->info['name']] = $precision ?
self::format( $this->info['length'], $precision ) :
$this->info['length'];
return $files;
}
public function save ( $filename = null ) {
return file_put_contents( is_null( $filename ) ? $this->info['name'] . '.torrent' : $filename, $this->encode( $this ) );
}
static public function file_get_contents ( $file, $timeout = self::timeout, $offset = null, $length = null ) {
if ( is_file( $file ) || ini_get( 'allow_url_fopen' ) ) {
$context = ! is_file( $file ) && $timeout ?
stream_context_create( array( 'http' => array( 'timeout' => $timeout ) ) ) :
null;
return ! is_null( $offset ) ? $length ?
@file_get_contents( $file, false, $context, $offset, $length ) :
@file_get_contents( $file, false, $context, $offset ) :
@file_get_contents( $file, false, $context );
} elseif ( ! function_exists( 'curl_init' ) )
return self::set_error( new Exception( 'Install CURL or enable "allow_url_fopen"' ) );
$handle = curl_init( $file );
if ( $timeout )
curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );
if ( $offset || $length )
curl_setopt( $handle, CURLOPT_RANGE, $offset . '-' . ( $length ? $offset + $length -1 : null ) );
curl_setopt( $handle, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec( $handle );
$size = curl_getinfo( $handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD );
curl_close( $handle );
return ( $offset && $size == -1 ) || ( $length && $length != $size ) ? $length ?
substr( $content, $offset, $length) :
substr( $content, $offset) :
$content;
public function errors() {
return empty( self::$errors ) ?
false :
self::$errors;
}
}