Установите истечение кэширования HTTP, рекомендуемое Google PageSpeed

Я не думаю, что размер файла влияет на продолжительность переименования.

Для копии - Qt не предлагает ничего встроенного, вы должны реализовать его самостоятельно. Ключевым вопросом здесь является то, что вам нужно будет найти способ опроса для отмены копирования непрерывно. Это означает, что вы не можете заблокировать основной поток, чтобы иметь возможность обрабатывать события.

Если вы переходите на дополнительный поток, чтобы реагировать на основной поток или решили использовать основной поток - в обоих случаях случаях вам понадобится реализовать «фрагментированное» копирование - по одному фрагменту за один раз с использованием буфера, пока файл не будет скопирован или копирование отменено. Вам нужно это, чтобы обрабатывать пользовательские события и отслеживать ход копирования.

Я предлагаю вам внедрить класс рабочего помощника-помощника QObject, который отслеживает имя файла, общий размер, размер буфера, прогресс и очистку после отмены. Тогда вы можете выбрать, будете ли вы использовать его в основном потоке или в выделенном потоке.

EDIT: нашел его, но вам лучше проверить его, поскольку это было сделано в качестве примера и имеет не были тщательно протестированы:

class CopyHelper : public QObject {
    Q_OBJECT
    Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
public:
    CopyHelper(QString sPath, QString dPath, quint64 bSize = 1024 * 1024) :
        isCancelled(false), bufferSize(bSize), prog(0.0), source(sPath), destination(dPath), position(0) { }
    ~CopyHelper() { free(buff); }

    qreal progress() const { return prog; }
    void setProgress(qreal p) {
        if (p != prog) {
            prog = p;
            emit progressChanged();
        }
    }

public slots:
    void begin() {
        if (!source.open(QIODevice::ReadOnly)) {
            qDebug() << "could not open source, aborting";
            emit done();
            return;
        }
        fileSize = source.size();
        if (!destination.open(QIODevice::WriteOnly)) {
            qDebug() << "could not open destination, aborting";
            // maybe check for overwriting and ask to proceed
            emit done();
            return;
        }
        if (!destination.resize(fileSize)) {
            qDebug() << "could not resize, aborting";
            emit done();
            return;
        }
        buff = (char*)malloc(bufferSize);
        if (!buff) {
            qDebug() << "could not allocate buffer, aborting";
            emit done();
            return;
        }
        QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection);
        //timer.start();
    }
    void step() {
        if (!isCancelled) {
            if (position < fileSize) {
                quint64 chunk = fileSize - position;
                quint64 l = chunk > bufferSize ? bufferSize : chunk;
                source.read(buff, l);
                destination.write(buff, l);
                position += l;
                source.seek(position);
                destination.seek(position);
                setProgress((qreal)position / fileSize);
                //std::this_thread::sleep_for(std::chrono::milliseconds(100)); // for testing
                QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection);
            } else {
                //qDebug() << timer.elapsed();
                emit done();
                return;
            }
        } else {
            if (!destination.remove()) qDebug() << "delete failed";
            emit done();
        }
    }
    void cancel() { isCancelled = true; }

signals:
    void progressChanged();
    void done();

private:
    bool isCancelled;
    quint64 bufferSize;
    qreal prog;
    QFile source, destination;
    quint64 fileSize, position;
    char * buff;
    //QElapsedTimer timer;
};

Сигнал done() используется для deleteLater() диалогового окна копирования / закрытия копии или любого другого. Вы можете включить истекший таймер и использовать его для реализации свойства истекшего времени и расчетного времени. Приостановка - еще одна возможная функция для реализации. Использование QMetaObject::invokeMethod() позволяет циклу событий периодически обрабатывать пользовательские события, чтобы вы могли отменить и обновить ход, который идет от 0 до 1. Вы можете легко настроить его и для перемещения файлов.

25
задан pws5068 20 April 2010 в 16:15
поделиться

2 ответа

В вашем корне .htaccess:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 604800 seconds"
  ExpiresByType text/javascript "access plus 216000 seconds"
  ExpiresByType application/x-javascript "access plus 216000 seconds"
  ExpiresByType text/html "access plus 600 seconds"
  ExpiresByType application/xhtml+xml "access plus 600 seconds"
</IfModule>

И следуйте:

<IfModule mod_headers.c>
<FilesMatch "\\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=2692000, public"
</FilesMatch>
<FilesMatch "\\.(css)$">
Header set Cache-Control "max-age=2692000, public"
</FilesMatch>
<FilesMatch "\\.(js)$">
Header set Cache-Control "max-age=216000, private"
</FilesMatch>
<FilesMatch "\\.(x?html?|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</FilesMatch>
Header unset ETag
Header unset Last-Modified
</IfModule>

Это точно такой же код, который я использую для каждого свойства, которым я управляю и который предлагает мне (и PageSpeed ) наиболее удовлетворительные результаты. Можно спорить о конкретных правилах, поэтому я сказал, что он удовлетворяет мне , но, безусловно, удовлетворяет PageSpeed.

29
ответ дан methode 28 November 2019 в 21:40
поделиться

Это можно сделать как с помощью htaccess, так и с помощью php. Обычно вы не хотите принудительно кэшировать фактический html, поскольку его динамическое содержимое, управляемое базой данных (при необходимости, это можно сделать с помощью функции php header () ). То, что вы хотите кешировать, - это внешние файлы css и javascript, а также файлы изображений.

См. Здесь решение .htaccess: http://www.askapache.com/htaccess/apache-speed-expires.html

1
ответ дан 28 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: