Кто пользуется Rutorrent в 32 битных системах наверное сталкивались с проблемой, при которой нельзя переносить торренты размером больше 2/4 Gb. Все основные предложения по обходу этой проблемы заключались в переходе на 64 битную ОС. Я же не мог взять и так просто перейти (домашний шлюз вот уже долгое время крутился на 32 битной Ubuntu, а заниматься переустановкой и настройкой шлюза с нуля не было никакого желания). В одном из постов автор Rutorrent предложил заменить вызовы php функции переноса/копирования на sh. Но до дела так и не дошло. В итоге решил заняться этим сам (к слову с php до этого никогда не работал, поэтому код может быть не идеальным, но зато рабочий). Изменения надо вносить в файл util_rt.php, который находиться в директории ../rutorrent/plugins/datadir. Надо найти строки
Вот и все. Теперь плагин может переносить файлы любого размера.
function rtMoveFile( $src, $dst, $dbg = false )
{
$ss = LFS::stat($src);
if( !rename( $src, $dst ) )
{
if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
if( $dbg ) rtDbg( __FUNCTION__, "to ".$dst );
if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
if( !copy( $src, $dst ) )
{
if( $dbg ) rtDbg( __FUNCTION__, "copy fail" );
return false;
}
if( !unlink( $src ) )
if( $dbg ) rtDbg( __FUNCTION__, "delete fail (".$src.")" );
}
// there are problems here, if run-user is not file owner
if($ss!==false)
touch( $dst, $ss['mtime'], $ss['atime'] );
return true;
}
И привести к виду function rtMoveFile( $src, $dst, $dbg = false )
{
$ss = LFS::stat($src);
$src = escapeshellarg($src);
$dst = escapeshellarg($dst);
exec ("/bin/mv -f $src $dst", $output, $retval);
$err = implode ($output);
if (!empty ($err))
{
if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
if( $dbg ) rtDbg( __FUNCTION__, "to ".$dst );
if( $dbg ) rtDbg( __FUNCTION__, "erorr ".$err );
if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
exec ("/bin/cp -r -f $src $dst 2>&1", $output, $retval);
$err = implode ($output);
if (!empty ($err))
{
if( $dbg ) rtDbg( __FUNCTION__, "copy fail ".$err );
return false;
}
}
// there are problems here, if run-user is not file owner
if($ss!==false)
touch( $dst, $ss['mtime'], $ss['atime'] );
return true;
}
Вот и все. Теперь плагин может переносить файлы любого размера.