ปรับใช้แอปพลิเคชัน PHP โดยใช้ Docker-compose

แอปพลิเคชัน PHP มักประกอบด้วยเว็บเซิร์ฟเวอร์ระบบฐานข้อมูลเชิงสัมพันธ์และล่ามภาษาเอง ในบทช่วยสอนนี้เราจะใช้ประโยชน์จากแอพพลิเคชั่น PHP แบบเต็มโดยใช้นักเทียบท่า นี่คือการสอนเชิงลึกที่เราจะสร้างและดัดแปลงบรรจุภัณฑ์สำหรับ Nginx (เว็บเซิร์ฟเวอร์), MySQL (ระบบฐานข้อมูล) และ PHP

เพื่อประโยชน์ของบทช่วยสอนนี้เราจะเขียนแอปพลิเคชั่นเรียบง่ายที่อ่านรายชื่อเมืองจากฐานข้อมูลและแสดงบนหน้าเว็บด้วยวิธีนี้เราจะแสดงให้เห็นถึงพื้นฐาน แต่ทำงานได้กับแอปพลิเคชัน PHP

คู่มือนี้อนุมานว่าคุณได้ติดตั้ง Docker-CE ไว้แล้วและอย่างน้อยก็มีความรู้เกี่ยวกับการทำงานของ Docker น้อยที่สุด สำหรับเรื่องนั้นคุณสามารถอ่านบทช่วยสอนต่อไปนี้:

การกำหนดค่าสภาพแวดล้อมการทำงานของเรา

โดยทั่วไปแล้วแอปพลิเคชันที่ใช้ชีวิตจริงของนักเทียบท่าจะประกอบด้วยหลายคอนเทนเนอร์ การจัดการสิ่งเหล่านี้ด้วยตนเองสามารถกลายเป็นเรื่องยุ่งและยุ่งยากได้ง่าย นั่นคือสิ่งที่นักเทียบท่าประกอบเข้ามาเล่น ช่วยให้คุณจัดการคอนเทนเนอร์จำนวนหนึ่งผ่านyamlไฟล์การกำหนดค่าอย่างง่าย

ติดตั้งส่วนประกอบนักเทียบท่า

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

สร้างโฟลเดอร์เพื่อเก็บไฟล์ที่จำเป็นทั้งหมดของตัวอย่างนี้แล้วcdเข้าไปในนั้น นับจากนี้ไปนี่คือไดเรกทอรีการทำงานของเราและทุกคำสั่งจะถูกดำเนินการภายในโฟลเดอร์นี้และทุกเส้นทางจะถูกอ้างอิงโดยสัมพันธ์กับมัน WORKING_DIRโฟลเดอร์นี้อาจได้รับการอ้างอิงในภายหลัง

mkdir ~/docker
cd ~/docker

ตอนนี้สร้างอีกสามโฟลเดอร์

mkdir php nginx app

phpโฟลเดอร์เป็นที่ที่เราจะสร้างภาพที่กำหนดเอง PHP เราnginxโฟลเดอร์จะเก็บไฟล์ที่จำเป็นสำหรับภาพ Nginx ของเราเองและappโฟลเดอร์เป็นที่ที่เราจะใส่รหัสที่มาและการกำหนดค่าของโปรแกรมตัวอย่างของเรา

การกำหนดค่าคอนเทนเนอร์ PHP

ในตัวอย่างนี้เราจะใช้php-fpmเพื่อเชื่อมต่อกับเว็บเซิร์ฟเวอร์ Nginx เราจะใช้อิมเมจพื้นฐาน PHP อย่างเป็นทางการ อย่างไรก็ตามเราจำเป็นต้องติดตั้งและเปิดใช้งานส่วนขยายบางอย่างเพื่อให้เราสามารถเข้าถึงฐานข้อมูลได้ ภายในphpโฟลเดอร์สร้างไฟล์ชื่อDockerfileและใส่เนื้อหาต่อไปนี้ลงในมัน

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

โปรดทราบว่าเรากำลังใช้อิมเมจ PHP อย่างเป็นทางการในเวอร์ชันอัลไพน์ อัลไพน์คือการกระจายขนาดเล็กมากที่กำหนดเป้าหมายไปยังภาชนะบรรจุโดยให้รอยเท้าที่เล็กกว่ามาก นอกจากนี้ให้สังเกตการใช้คำสั่งdocker-php-ext-installอิมเมจ PHP อย่างเป็นทางการจัดทำคำสั่งนี้เพื่อให้กระบวนการติดตั้งและกำหนดค่าส่วนขยาย PHP ง่ายขึ้น

ตอนนี้เรามาสร้างอิมเมจ Docker นี้โดยการสร้างสิ่งต่อไปนี้ (ภายในของเราWORKING_DIR):

docker build -t vultr-php php/

docker-compose.ymlไฟล์

ดังที่ได้กล่าวไปแล้วdocker-composeอนุญาตให้คุณจัดการคอนเทนเนอร์จำนวนหนึ่งผ่านไฟล์การกำหนดค่าอย่างง่าย docker-compose.ymlแฟ้มการกำหนดค่านี้เป็นชื่อโดยทั่วไป สร้างไฟล์นี้ภายในappโฟลเดอร์

touch app/docker-compose.yml

ตอนนี้ใส่เนื้อหาต่อไปนี้ลงในไฟล์นี้

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

เราจะอธิบายไวยากรณ์นี้ ก่อนอื่นให้จดบรรทัดแรก

version: '2'

สิ่งนี้ระบุเวอร์ชันของdocker-compose.ymlไฟล์กำหนดค่าที่ใช้ บรรทัดถัดไประบุบริการหรือกล่าวอีกนัยหนึ่งว่าคอนเทนเนอร์ที่จะได้รับการจัดเตรียม

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

โปรดทราบว่าทุกบริการมีรหัสเฉพาะภายในservicesบล็อก ชื่อที่ระบุที่นี่จะถูกใช้เพื่ออ้างอิงคอนเทนเนอร์เฉพาะในภายหลัง โปรดทราบว่าภายในการphpกำหนดค่าเรากำหนดภาพที่ใช้ในการเรียกใช้คอนเทนเนอร์ (นี่คือภาพที่เราสร้างขึ้นก่อนหน้านี้) นอกจากนี้เรายังกำหนดแผนที่ปริมาณ

volumes:
  - ./:/app

สิ่งนี้บอกdocker-composeให้แม็พไดเร็กทอรีปัจจุบัน ( ./) กับ/appไดเร็กทอรีภายในคอนเทนเนอร์ บรรทัดสุดท้ายตั้งค่า/appโฟลเดอร์ภายในคอนเทนเนอร์เป็นไดเรกทอรีทำงานซึ่งหมายความว่านี่คือโฟลเดอร์ที่คำสั่งในอนาคตทั้งหมดภายในคอนเทนเนอร์จะถูกดำเนินการตามค่าเริ่มต้น

ตอนนี้เราสามารถดัดแปลงบรรจุภัณฑ์ของเรา

cd ~/docker/app
docker-compose up -d

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่าคอนเทนเนอร์ PHP ถูกเรียกใช้:

docker ps

วิธีดำเนินการคำสั่งภายในคอนเทนเนอร์

ยังอยู่ในappโฟลเดอร์เราสามารถเรียกใช้คำสั่งใด ๆ ภายในเซอร์วิสคอนเทนเนอร์ที่กำหนดด้วยความช่วยเหลือของdocker-composeคำสั่ง

docker-compose exec [service] [command]

[service]ยึดหมายถึงกุญแจสำคัญในการให้บริการ phpในกรณีของเรานี้เป็น ลองเรียกใช้คำสั่งภายในคอนเทนเนอร์เพื่อตรวจสอบเวอร์ชั่น PHP ของเรา

docker-compose exec php php -v

คุณจะเห็นผลลัพธ์ต่อไปนี้

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

การกำหนดค่าคอนเทนเนอร์ Nginx

เช่นเดียวกับคอนเทนเนอร์ PHP เราจำเป็นต้องสร้างภาพที่กำหนดเองสำหรับเว็บเซิร์ฟเวอร์ virtual hostแต่ในกรณีนี้เราก็ต้องให้การกำหนดค่าสำหรับเรา ตรวจสอบให้แน่ใจว่าคุณอยู่ภายในของเราWORKING_DIRและสร้างโฟลเดอร์Dockerfileภายในnginx:

cd ~/docker
touch nginx/Dockerfile

ตอนนี้ใส่เนื้อหาต่อไปนี้ในนี้Dockerfile:

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

เรากำลังใช้อิมเมจ Nginx ที่เป็นค่าเริ่มต้นโดยยึดตามอัลไพน์ ในไฟล์ Docker นี้เราเพียงคัดลอกไฟล์การกำหนดค่าไปยังการตั้งค่าแอปพลิเคชันของเรา ก่อนสร้างภาพนี้ให้สร้างไฟล์กำหนดค่า

touch nginx/default.conf

ตอนนี้เติมด้วยเนื้อหานี้

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

ทราบว่าที่fastcgi_pass php:9000บรรทัดเราจะอ้างอิงภาชนะ PHP โดยมันเป็นชื่อในserviceบล็อกของdocker-compose.ymlไฟล์การกำหนดค่า docker-composeสร้างเครือข่ายภายในและกำหนดชื่อบริการเป็นชื่อโฮสต์ให้กับแต่ละบริการที่กำหนด ตอนนี้เราสามารถสร้างภาพ Nginx

docker build -t vultr-nginx nginx/

อัปเดต docker-compose.yml

ตอนนี้อัปเดตapp/docker-compose.ymlไฟล์

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

เราได้เพิ่มบริการใหม่เท่านั้น การกำหนดค่าเกือบเหมือนกันยกเว้นสำหรับสิ่งต่อไปนี้

depends_on:
  - php
ports:
  - 80:80

เมื่อคอนเทนเนอร์ Nginx ต้องการบริการ PHP เพื่อเริ่มต้นอย่างสมบูรณ์เราจะบังคับใช้ข้อกำหนดนี้ในdepends_onตัวเลือก portsที่สำคัญการกำหนดค่าแผนที่พอร์ตโฮสต์กับพอร์ตภาชนะที่นี่เราแผนที่พอร์ต80ในการเป็นเจ้าภาพในการพอร์ต80ในภาชนะที่

ตอนนี้สร้างไฟล์ที่เรียกว่าindex.phpภายในappโฟลเดอร์และใส่ต่อไปในนั้น

<?php phpinfo();

ตรวจสอบให้แน่ใจว่าพอร์ต80นั้นสามารถเข้าถึงได้ผ่านไฟร์วอลล์ของคุณและดำเนินการดังต่อไปนี้

cd ~/docker/app
docker-compose up -d

ตรวจสอบอีกครั้งว่าบริการเสร็จสิ้น

docker ps

[vultr-instance-ip]เบราว์เซอร์ที่เปิดกว้างและเข้าถึง คุณอาจค้นหาที่อยู่ IP ของ Vultr อินสแตนซ์ของคุณโดยเรียกใช้สิ่งต่อไปนี้

hostname -I

คุณจะเห็นหน้าข้อมูล PHP

การกำหนดค่าคอนเทนเนอร์ MySQL

ภาพ MySQL อย่างเป็นทางการช่วยให้คุณสามารถกำหนดค่าคอนเทนเนอร์ผ่านตัวแปรสภาพแวดล้อมที่เรียบง่าย สิ่งนี้สามารถทำได้ด้วยenvironmentตัวเลือกที่อยู่ในคำจำกัดความบล็อกบริการ อัพเดต~/docker/app/docker-compose.ymlไฟล์เป็นต่อไปนี้

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

ตอนนี้เราได้กำหนดบริการใหม่สำหรับฐานข้อมูล dbdata:/var/lib/mysqlขอให้สังเกตเส้น สิ่งนี้จะเมาท์พา ธ บนคอนเทนเนอร์/var/lib/mysqlไปยังโวลุ่มถาวรที่จัดการโดย Docker ด้วยวิธีนี้ข้อมูลของฐานข้อมูลจะคงอยู่หลังจากลบคอนเทนเนอร์ ไดรฟ์ข้อมูลนี้จำเป็นต้องกำหนดในบล็อกระดับสูงสุดตามที่คุณเห็นในตอนท้ายของไฟล์

ก่อนที่จะจัดการการกำหนดค่าใหม่ของเราลองดาวน์โหลดฐานข้อมูล MySQL ตัวอย่าง MySQL เอกสารอย่างเป็นทางการ ให้บริการฐานข้อมูลตัวอย่าง เราจะใช้ฐานข้อมูลโลกที่มีชื่อเสียง ฐานข้อมูลนี้ให้รายชื่อประเทศและเมืองต่างๆ ในการดาวน์โหลดตัวอย่างนี้ให้ดำเนินการต่อไปนี้ภายในโฟลเดอร์แอพของเรา

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

ตอนนี้ให้เตรียมการภาชนะของเรา

docker-compose up -d

ดังที่คุณอาจสังเกตเห็นแล้วdocker-compose upคำสั่งเริ่มต้นเฉพาะคอนเทนเนอร์ที่ยังไม่ได้เริ่ม มันตรวจสอบความแตกต่างระหว่างdocker-compose.ymlไฟล์ของคุณและการกำหนดค่าปัจจุบันของการเรียกใช้คอนเทนเนอร์

อีกครั้งตรวจสอบว่าคอนเทนเนอร์ MySQL เริ่มต้นแล้ว

docker ps

ตอนนี้เติมฐานข้อมูลโลก

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

คุณสามารถตรวจสอบว่าฐานข้อมูลนั้นถูกเติมด้วยการเลือกข้อมูลโดยตรงจากฐานข้อมูล ก่อนอื่นให้เข้าถึงพรอมต์ MySQL ภายในคอนเทนเนอร์

docker-compose exec mysql mysql -uroot -proot world

ในพรอมต์ MySQL เรียกใช้ต่อไปนี้

select * from city limit 10;

คุณจะเห็นรายชื่อเมือง ตอนนี้ออกจากพรอมต์ MySQL

mysql> exit

สร้างใบสมัครของเรา

ตอนนี้ภาชนะที่จำเป็นทั้งหมดเปิดใช้งานแล้วเราสามารถมุ่งเน้นไปที่แอปพลิเคชันตัวอย่างของเรา อัพเดต app/index.phpไฟล์เป็นต่อไปนี้

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

หากคุณเข้าถึง[vultr-instance-ip]เว็บเบราว์เซอร์คุณจะเห็นรายการเมืองที่มีประชากรมากที่สุดในโลก ขอแสดงความยินดีคุณได้ปรับใช้แอปพลิเคชัน PHP ที่ทำงานได้อย่างสมบูรณ์โดยใช้นักเทียบท่า

ข้อสรุป

ในบทช่วยสอนนี้ฉันได้สาธิตวิธีการตั้งค่าแอปพลิเคชัน PHP ที่ทำงานได้อย่างสมบูรณ์ เราสร้างอิมเมจที่กำหนดเองสำหรับ PHP และ Nginx และกำหนดค่านักเทียบท่าเพื่อแต่งคอนเทนเนอร์ของเรา แม้จะเป็นพื้นฐานและเรียบง่ายการตั้งค่านี้สะท้อนให้เห็นถึงสถานการณ์ในชีวิตจริง

ในคู่มือนี้เราได้สร้างและติดแท็กรูปภาพของเราในพื้นที่ สำหรับการตั้งค่าที่ยืดหยุ่นมากขึ้นคุณสามารถส่งภาพเหล่านี้ไปยังรีจิสทรีนักเทียบท่าได้ คุณสามารถกดไปที่Registry Dockerอย่างเป็นทางการหรือตั้งค่า Registry Docker ของคุณเองก็ได้ ไม่ว่าในกรณีใด ๆ สิ่งนี้จะช่วยให้คุณสร้างภาพของคุณบนโฮสต์หนึ่งและใช้มันในอีกโฮสต์หนึ่ง

สำหรับการใช้งานที่มีรายละเอียดมากขึ้นของdocker-composeคุณควรดูที่เอกสารที่เป็นทางการ

คุณอาจต้องการเพิ่มส่วนขยายเพิ่มเติมทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอปพลิเคชันของคุณและกรอบงาน PHP ที่คุณใช้ สิ่งนี้สามารถทำได้โดยการปรับเปลี่ยนที่Dockerfileใช้ในการสร้างภาพ PHP ของเราเอง อย่างไรก็ตามส่วนขยายบางอย่างจำเป็นต้องมีการติดตั้งเพิ่มเติมในคอนเทนเนอร์ คุณควรดูรายการส่วนขยายใน เอกสารประกอบอย่างเป็นทางการของ PHPเพื่อตรวจสอบข้อกำหนดพื้นฐานของแต่ละส่วนขยาย

ฝากความเห็น

วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7 LAMP VPS

วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7 LAMP VPS

เรียนรู้วิธีการติดตั้ง Directus 6.4 CMS บน CentOS 7; ระบบการจัดการเนื้อหา Headless ที่มีความยืดหยุ่นสูงและปลอดภัย

ตั้งค่า Nginx บน Ubuntu เพื่อสตรีมวิดีโอสด HLS

ตั้งค่า Nginx บน Ubuntu เพื่อสตรีมวิดีโอสด HLS

เรียนรู้วิธีการตั้งค่า Nginx บน Ubuntu สำหรับการสตรีมวิดีโอสด HLS ด้วยคำแนะนำที่ชัดเจนและเป็นประโยชน์

การสำรองข้อมูลยอดนิยมด้วย Percona XtraBackup บนแอพ WordPress แบบคลิกเดียว

การสำรองข้อมูลยอดนิยมด้วย Percona XtraBackup บนแอพ WordPress แบบคลิกเดียว

เรียนรู้การใช้ Percona XtraBackup สำหรับการสำรองข้อมูลด้วยวิธีที่เป็นระบบและง่ายดายบน WordPress ออนไลน์ของคุณ

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS ซึ่งเป็นโอเพ่นซอร์สและระบบปฏิบัติการฟรีพร้อมเวอร์ชันล่าสุดแล้ว สามารถตอบสนองความต้องการของผู้ใช้ Windows ยุคใหม่และล้ม Microsoft ได้หรือไม่? มาหาข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเก่านี้ แต่เป็นประสบการณ์ OS ที่ใหม่กว่ากัน

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

การโจมตีของ Ransomware กำลังเพิ่มขึ้น แต่ AI สามารถช่วยจัดการกับไวรัสคอมพิวเตอร์ตัวล่าสุดได้หรือไม่? AI คือคำตอบ? อ่านที่นี่รู้ว่า AI boone หรือ bane

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

ในที่สุด Whatsapp ก็เปิดตัวแอพเดสก์ท็อปสำหรับผู้ใช้ Mac และ Windows ตอนนี้คุณสามารถเข้าถึง Whatsapp จาก Windows หรือ Mac ได้อย่างง่ายดาย ใช้ได้กับ Windows 8+ และ Mac OS 10.9+

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

อ่านข้อมูลนี้เพื่อทราบว่าปัญญาประดิษฐ์กำลังได้รับความนิยมในหมู่บริษัทขนาดเล็กอย่างไร และเพิ่มโอกาสในการทำให้พวกเขาเติบโตและทำให้คู่แข่งได้เปรียบ

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

เมื่อเร็ว ๆ นี้ Apple เปิดตัว macOS Catalina 10.15.4 การอัปเดตเสริมเพื่อแก้ไขปัญหา แต่ดูเหมือนว่าการอัปเดตทำให้เกิดปัญหามากขึ้นที่นำไปสู่การสร้างเครื่อง Mac อ่านบทความนี้เพื่อเรียนรู้เพิ่มเติม

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

คอมพิวเตอร์ของเราจัดเก็บข้อมูลทั้งหมดในลักษณะที่เรียกว่าระบบไฟล์บันทึก เป็นวิธีการที่มีประสิทธิภาพที่ช่วยให้คอมพิวเตอร์สามารถค้นหาและแสดงไฟล์ได้ทันทีที่คุณกดค้นหาhttps://wethegeek.com/?p=94116&preview=true