在加载

时间:2018-02-10 08:18:38

标签: php symfony docker

我在Windows上使用Docker作为本地开发环境。我已将docker-compose设置为使用3个单独的容器:

  • PHP 7.2
  • Nginx的
  • MariaBD

容器主持Symfony 4网站。当我加载页面时,请求需要700-900毫秒才能完成。但是,如果我像这样运行ApacheBench:

ab.exe -n 1000 -c 1 http://localhost/

当我现在加载页面时(在浏览器中,当ab正在运行时),请求时间现在降至100-200ms。将symfony环境设置为prod时会发生同样的情况。在不运行ApacheBench的情况下,加载时间为400-500ms,但运行ApacheBench时,加载时间突然降至约30ms。

有没有什么办法可以让我无需经常运行ApacheBench即可获得快速响应时间?

1 个答案:

答案 0 :(得分:0)

事实证明这是一个缓存问题,但与PHP或nginx无关。

相反,它与Docker for Windows挂载卷的方式有关。它使用本地SMB共享,​​事实证明 - 它真的很慢。每当文件发生变化时,它都会检查文件是否在每次访问文件时都发生了变化,而不是同步更改。

由于我对cifs知之甚少,似乎Docker将所有cifs挂载配置为具有1秒缓存。因此,当运行ApacheBench时,它将大约每0.7秒加载一页。这使cifs缓存保持温暖,这反过来意味着在ApacheBench运行时在浏览器中手动加载页面的速度很快。

我的解决方案是编写一个小批量脚本,手动同步每秒可能发生变化的源部分:

#! /bin/bash
shopt -s dotglob

cd /host_override
HOST_OVERRIDES="`echo *`"
for FILE in *; do
    echo "Override found for $FILE"

    cd /var/www/html
    rm -rf "$FILE"
    ln -s "/host_override/$FILE"
    cd /host_override
done

# Initial sync
cd /host_data
for FILE in *; do
    if ! [ -e "/host_override/$FILE" ]; then
        echo "Initial sync of $FILE ..."
        rsync -a "$FILE" "/var/www/html/"
    fi
done
echo "Done."

# Small sync of files that actually change
while true;
do
    for FILE in src config templates public .env; do
        rsync -aut "$FILE" "/var/www/html/"
    done

    sleep 1
done

我覆盖docker-compose.yml中的入口点,如下所示:

entrypoint: ["bash", "-c", "docker-sync & docker-php-entrypoint php-fpm"]
volumes:
    - .:/host_data:ro
    - /host_override
    - ./var:/host_override/var:rw
    - /host_override/var/log
    - /host_override/var/cache
    - ./var/user_uploads/:/host_override/var/user_uploads/:rw
    - ./docker/php/docker-sync.sh:/usr/local/bin/docker-sync

编辑文件与主机上出现的更改之间的1秒延迟是不明显的,并且网站的性能比以前好得多。即使在dev环境中,响应时间也是<100ms。在prod环境中,响应时间为~20ms