Ограничение файла функции PHP ftp_put?

#php #limit

#php #ограничение

Вопрос:

я хочу отправить текущие 30k файлов на удаленный сервер, на котором есть функция ftp_put. Но время ожидания страницы истекло, потому что она пыталась отправить их все. Я хочу отправлять указанное количество файлов при каждом обновлении страницы. Например, 50 файлов для каждого обновления. Кто-нибудь может мне помочь это сделать? Я много искал решение, но не смог найти никакой информации. Я не знал точно, как искать в Интернете, потому что мой английский не очень хорош, спасибо.

 <?php
$file = 'critical_logs/'.$entry;
$send_to = 'httpdocs/abc/'.$entry;

$conn = ftp_connect('ftp.example.com');
if (!$conn) die('ftp.example.com connect error'); 
$login_result = ftp_login($conn, $ftp_user_name, $ftp_user_pass);

if (ftp_put($conn, $file, $send_to, FTP_ASCII)) {
 echo "successn";
} else {
 echo "errorn";
}

?>
  

Комментарии:

1. Я думаю, что это всего лишь ЧАСТЬ кода — предположительно, это в цикле? Где / как выбираются файлы?

2. Почему бы не использовать cron для этого?

3. Это первая часть моего кода. if ($handle = opendir(‘logs’)) { while (false !== ($entry = readdir($handle))) { if ($entry != «.» amp;amp; $entry != «..») { $hop[] = $entry; } } closedir($handle); } srand((float) microtime() * 1000000); shuffle ($ hop); foreach ($ hop как $entry)

4. @Justinas Я не могу использовать cron. Что мне нужно добавить в код для операции ограничения?

5. set_time_limit(0); и просто оставьте его запущенным

Ответ №1:

Моей первоначальной идеей было получить список файлов в critical_logs каталоге и записать их в file. Файл журнала должен находиться в другом каталоге, чтобы предотвратить его отправку на FTP-сервер. Как только этот список файлов будет создан, обрабатывайте файл порциями по 50 штук за раз, в вашем случае. После обработки 50 файлов файл журнала обновляется для удаления этих записей — таким образом, при следующей загрузке страницы процесс может начаться снова. Пример, протестированный, но без какого-либо тестирования FTP

     set_time_limit(0);
    error_reporting( E_ALL );


    $chunksize=20;          # set to 50
    $use_ftp_cmds=false;    # set as true to actually attempt FTP commands

    $ftp_host='ftp.example.com';
    $ftp_send_to='httpdocs/abs/';


    /* find all files in directory */
    $dir = __DIR__ . '/critical_logs/';
    $files = glob( $dir . '*.*' );

    /* create, if it does not exist, a log to record the files - in parent directory */
    chdir('..\');
    $log = getcwd() . '/files.txt';

    /* add record for each file */
    if( !file_exists( $log ) ){
        foreach( $files as $file ){
            file_put_contents( $log, $file . PHP_EOL, FILE_APPEND );
        }
    }
    /* process the file in chunks */
    if( file_exists( $log ) ){
        clearstatcache();

        $lines = file( $log, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
        if( count( $lines ) > 0 ){

            $chunks = array_chunk( $lines, $chunksize );

            /* connect to FTP server */
            if( $use_ftp_cmds ){

                $conn = ftp_connect( $ftp_host );
                if( !$conn ) die( sprintf( '%s connect error', $ftp_host ) );

                $login_result = ftp_login( $conn, $ftp_user_name, $ftp_user_pass );
                if( !$login_result ) die( 'Failed to login to FTP server' );
            }





            /* Process the first chunk */
            $chunk = array_shift( $chunks );

            foreach( $chunk as $file ){
                /* ftp cmds */
                $result = $use_ftp_cmds ? ftp_put( $conn, $file, sprintf( '%s/%s', $ftp_send_to, $file ) , FTP_ASCII ) : true;
                if( $result ){
                    /* remove the line from the source file and save updated version */
                    array_splice( $lines, array_search( $file, $lines ), 1 );
                }
            }


            file_put_contents( $log, '' );

            foreach( $lines as $line ){
                file_put_contents( $log, $line . PHP_EOL, FILE_APPEND );
            }

        } else {
            printf('The file %s is empty',$log);
        }
    }
  

Комментарии:

1. 🙂 отличные новости — рад, что это помогло!