การผสานรวม Magento กับ Cloud Spanner

1. บทนำ

424db48d9db91638.png

การผสานรวม Magento กับแบ็กเอนด์ Cloud Spanner

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

โค้ดแล็บนี้เป็น Proof of Concept เพื่อใช้ประโยชน์จาก Cloud Spanner แทน MySQL สําหรับโมดูลแคตตาล็อก ซึ่งจะเป็นประโยชน์สำหรับทุกคนที่สนใจในการผสานรวม ทดสอบ และการทำให้ Magento หรือแอปพลิเคชัน PHP อื่นๆ ใช้งานได้ด้วย Spanner

Spanner คือฐานข้อมูลที่สอดคล้องกันแบบกระจายและจัดการอย่างเต็มรูปแบบสำหรับองค์กรของ Google Cloud ซึ่งรวมข้อดีของโมเดลฐานข้อมูลเชิงสัมพันธ์เข้ากับการปรับขนาดในแนวนอนแบบไม่ใช่เชิงสัมพันธ์ แพลตฟอร์มนี้ออกแบบมาเพื่อรองรับการใช้งานการประมวลผลธุรกรรมออนไลน์ทั่วโลก ความหมายของ SQL การขยายขนาดแนวนอนที่พร้อมใช้งานสูง และความสอดคล้องของธุรกรรม Spanner สามารถจัดการข้อมูลปริมาณมากได้ การใช้งานไม่ได้จำกัดไว้เพียงแอปพลิเคชันขนาดใหญ่เท่านั้น แต่ยังช่วยให้ใช้เครื่องมือฐานข้อมูลที่มาตรฐานสำหรับเวิร์กโหลดทั้งหมดที่ต้องใช้ RDBMS ได้ Spanner ทำให้ระบบไม่มีช่วงพักสำหรับการบำรุงรักษาที่วางแผนไว้หรือความล้มเหลวในภูมิภาค โดยมี SLA ความพร้อมใช้งาน 99.999% รองรับแอปพลิเคชันสมัยใหม่เนื่องจากมีความพร้อมใช้งานและความสามารถในการปรับขนาดสูง

สิ่งที่คุณจะได้เรียนรู้

  • วิธีติดตั้ง Magento ใน GCE
  • วิธีตั้งค่าโปรแกรมจำลอง Spanner
  • วิธีย้ายสคีมา MySQL ที่มีอยู่ไปยัง Spanner โดยใช้ HarbourBridge
  • สิ่งที่คุณต้องเปลี่ยนแปลงเพื่อผสานรวมแอปพลิเคชัน PHP เช่น Magento ที่ใช้ MySQL สำหรับแบ็กเอนด์ฐานข้อมูลเพื่อทำงานร่วมกับ Spanner

สิ่งที่คุณจะสร้าง

Codelab นี้มุ่งเน้นไปที่การผสานรวม Magento กับ Spanner เรามีบล็อกโค้ดและวิธีการตั้งค่าให้คุณคัดลอกและวาง แต่ไม่ได้อธิบายอย่างละเอียด

ใน Codelab นี้ คุณจะเริ่มการผสานรวม Magento กับ Spanner สิ่งที่จะเกิดขึ้นกับคุณมีดังนี้

  • ตั้งค่าอินสแตนซ์ GCE ที่มีการติดตั้ง Magento
  • ติดตั้ง Spanner Emulator
  • ติดตั้ง HarbourBridge Tool สำหรับการย้ายข้อมูลจาก MySQL ไปยัง Spanner
  • แก้ไขคอลเล็กชัน Magento เพื่อโหลดแคตตาล็อกผลิตภัณฑ์จาก Spanner

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud ที่เชื่อมต่อกับบัญชีสำหรับการเรียกเก็บเงิน
  • ความรู้เรื่อง PHP, Linux และการกำหนดค่า Apache จะสามารถทำได้
  • ประสบการณ์ Magento จะมีประโยชน์ แต่ก็ไม่จำเป็น

2. การเตรียมอินสแตนซ์ GCE

สร้างอินสแตนซ์ GCE

สร้างอินสแตนซ์ Compute Engine ใน Google Cloud Platform โดยทำตามขั้นตอนที่ระบุไว้ที่นี่

เมื่อสร้างอินสแตนซ์ GCE ให้เปลี่ยนประเภทอินสแตนซ์เป็น e2-standard-2 และขนาดดิสก์เปิดเครื่องเป็น 20 GB คุณใช้ทุกอย่างเป็นค่าเริ่มต้นได้ แต่อย่าลืมเลือก "อนุญาตการเข้าชม HTTP" และ "อนุญาตการรับส่งข้อมูล HTTP" เนื่องจากเราจะใช้ประโยชน์จากอินเทอร์เฟซเว็บของ Magento

การดำเนินการนี้จะส่งผลให้ประเภทเครื่องเป็น e2-standard-2 ซึ่งไม่ใช่อินสแตนซ์แกนประมวลผลที่ใช้ร่วมกัน และมี vCPU 2 ตัว, RAM 8 GB และพื้นที่ดิสก์ 20 GB

ระบบปฏิบัติการคือ Debian 10 การสร้างอินสแตนซ์อาจใช้เวลา 1-2 นาที

เมื่อสร้างแล้ว ให้เข้าสู่ระบบโดยคลิก "SSH" ใน Cloud Console

4bf915ef8d37c942.png

ซึ่งจะเปิดหน้าต่างเบราว์เซอร์ใหม่และนำคุณไปยังเทอร์มินัล

ติดตั้งซอฟต์แวร์ที่จำเป็น

Magento จะต้องติดตั้งซอฟต์แวร์ที่จำเป็นเบื้องต้นบางอย่าง เราจึงจะเรียกใช้ Magento ได้ กล่าวคือ คุณจะต้องติดตั้ง PHP, Elastic, MySQL และ Apache ตามที่อธิบายไว้ด้านล่าง

  1. ติดตั้งแพ็กเกจที่จำเป็น
sudo apt update

sudo apt -y install lsb-release apt-transport-https ca-certificates wget git screen composer google-cloud-sdk-spanner-emulator gcc
  1. ติดตั้งโมดูล PHP ที่จำเป็นสำหรับ Magento
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list

sudo apt update

sudo apt -y install php7.4-fpm php7.4-common php7.4-mysql php7.4-gmp php7.4-curl php7.4-intl php7.4-mbstring php7.4-xmlrpc php7.4-gd php7.4-xml php7.4-cli php7.4-zip php7.4-bcmath php7.4-soap php7.4-grpc
  1. ติดตั้ง Elasticsearch และเริ่มต้นบริการ
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

sudo apt update && sudo apt -y install elasticsearch

echo "-Xms1g
-Xmx1g" | sudo tee /etc/elasticsearch/jvm.options.d/jvm.options

sudo systemctl start elasticsearch.service
  1. ติดตั้ง MySQL

คุณกำลังติดตั้ง MySQL เพื่อติดตั้งสคีมา Magento เริ่มต้น หลังจากนั้นคุณจะย้ายสคีมาไปยัง Spanner โดยใช้ HarbourBridge

wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb

sudo dpkg -i mysql-apt-config*

คำสั่ง dpkg ด้านบนจะแสดงพรอมต์แบบอินเทอร์แอกทีฟให้ติดตั้งเซิร์ฟเวอร์ MySQL 5.7 เลือกตัวเลือกต่อไปนี้

  • เซิร์ฟเวอร์และคลัสเตอร์ MySQL
  • mysql-5.7
  • ตกลง

a018bfc2ee00bdf5.png 1a126e452ca7312e.png ae39c6f4bbe3be74.png

sudo apt update && sudo apt -y install mysql-server
# You will be prompted to enter a root password
  1. ติดตั้ง Apache2
sudo apt -y install apache2

sudo a2enmod proxy_fcgi rewrite

ติดตั้งและกำหนดค่า Magento2

โปรเจ็กต์ Magento Commerce Cloud มีสคีมาฐานข้อมูลและบริการเพื่อเข้าถึงเว็บไซต์และร้านค้า Magento โดยสมบูรณ์

วิธีที่ง่ายที่สุดในการติดตั้งและใช้งานคือทำตามวิธีการของ Magento ในการติดตั้งโดยใช้ Composer

  1. ติดตั้ง Magento เวอร์ชัน 2.4.2 โดยใช้คอมโพสเซอร์ Magento 2 ต้องใช้คอมโพสเซอร์เวอร์ชัน 1.x คุณอาจเห็นคำเตือนบางอย่างเกี่ยวกับการเลิกใช้งานการสนับสนุนสำหรับเวอร์ชันนี้
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.2 magento2
  1. ตั้งค่าสิทธิ์ของโฟลเดอร์
cd magento2

find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +

find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
  1. กำหนดค่าโฮสต์เสมือน Magento โดยสร้าง /etc/apache2/sites-available/magento.conf ที่มีเนื้อหาด้านล่าง
sudo nano /etc/apache2/sites-available/magento.conf

<VirtualHost *:80>
        ServerAdmin admin@local-magento.com
        DocumentRoot /var/www/html/magento/

        <Directory /var/www/html/magento/>
                Options Indexes FollowSymlinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        <FilesMatch \.php$>
               SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
        </FilesMatch>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  1. สร้างลิงก์สัญลักษณ์และรีสตาร์ท apache2
cd ~/magento2
sudo ln -s $(pwd) /var/www/html/magento 
sudo ln -s /etc/apache2/sites-available/magento.conf  /etc/apache2/sites-enabled/magento.conf
sudo rm /etc/apache2/sites-enabled/000-default.conf

sudo systemctl restart apache2
  1. สร้างฐานข้อมูลและผู้ใช้สำหรับ Magento ใน MySQL
export ROOT_PASSWORD="<root password from installation>"
export GCE_INSTANCE_IP="<GCE instance IP>"
mysql -uroot -p$ROOT_PASSWORD -e "create database magento"

bin/magento sampledata:deploy

bin/magento setup:install --base-url=http://$GCE_INSTANCE_IP/ --db-host=localhost \
--db-name=magento --db-user=root --db-password=$ROOT_PASSWORD --admin-firstname=admin \
--admin-lastname=demo --admin-email=good@example.com --admin-user=admin \
--admin-password=magento123 --language=en_US --currency=USD --timezone=America/Chicago \
--use-rewrites=1

sudo chown -R :www-data ~/magento2/. 
  1. ยืนยันเวิร์กスペースในเครื่อง หากต้องการยืนยันว่าสภาพแวดล้อมในเครื่องโฮสต์เซิร์ฟเวอร์ ให้เข้าถึง Store โดยใช้ URL พื้นฐานที่คุณส่งในคำสั่งติดตั้ง ในตัวอย่างนี้ คุณสามารถเข้าถึงร้านค้า Magento ในพื้นที่ได้โดยใช้รูปแบบ URL ต่อไปนี้
  • http://&lt;GCEexternalIP&gt;/
  • http://&lt;GCEexternalIP&gt;/&lt;adminuri&gt;

คุณดู GCEexternalIP ได้ในคอนโซล Cloud

3947f1164e1d5409.png

หากต้องการเปลี่ยน URI สําหรับแผงผู้ดูแลระบบ ให้ใช้คําสั่งนี้เพื่อค้นหา

php bin/magento info:adminuri
  1. ปิดใช้แคชทั้งหน้า หากต้องการพัฒนา คุณปิดใช้แคชทั้งหน้าของ Magento2 ได้ ซึ่งจะช่วยให้คุณแก้ไขข้อมูลใน Spanner และแสดงข้อมูลในเว็บไซต์ได้โดยไม่ได้รับผลกระทบจากค่าที่แคชไว้
php bin/magento cache:disable full_page

ตั้งค่า Spanner

ติดตั้งโปรแกรมจำลอง Spanner

Cloud SDK มีโปรแกรมจำลองแบบในหน่วยความจำภายในเครื่อง ซึ่งคุณสามารถใช้เพื่อพัฒนาและทดสอบแอปพลิเคชันของคุณได้ฟรีโดยไม่ต้องสร้างโปรเจ็กต์ GCP หรือบัญชีสำหรับการเรียกเก็บเงิน เนื่องจากโปรแกรมจำลองจัดเก็บข้อมูลไว้ในหน่วยความจำเท่านั้น สถานะทั้งหมด รวมถึงข้อมูล สคีมา และการกำหนดค่าจะหายไปเมื่อรีสตาร์ท โปรแกรมจำลองมี API เดียวกับบริการการผลิต Spanner และมีไว้เพื่อการพัฒนาและทดสอบในเครื่อง ไม่ใช่สำหรับการใช้งานจริง

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

การใช้โปรแกรมจำลอง Spanner

# Set up a new configuration to use the emulator
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project magento
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/

# Start emulator in a screen session
screen -S magento
gcloud emulators spanner start &
gcloud spanner instances create magento-instance --config=emulator-config --description='Magento Instance' --nodes=1

# Detach from screen 
ctrl+a+d

export SPANNER_EMULATOR_HOST=localhost:9010

ย้ายข้อมูล Magento MySQL ไปยัง Spanner

ก่อนที่จะเจาะลึกในการผสานรวม Spanner เราจะใช้เครื่องมือชื่อ HarbourBridge เพื่อแปลงฐานข้อมูล MySQL ที่สร้างขึ้นเป็นส่วนหนึ่งของการติดตั้ง Magento ของเราด้านบนไปยัง Spanner

หัวใจหลักของ HarbourBridge คือเวิร์กโฟลว์อัตโนมัติสำหรับการโหลดเนื้อหาของฐานข้อมูล MySQL หรือ PostgreSQL ที่มีอยู่ไปยัง Spanner โดยไม่จำเป็นต้องกำหนดค่าใดๆ เลย โดยไม่ต้องเขียนไฟล์ Manifest หรือ Data Map แต่จะนำเข้าฐานข้อมูลต้นทาง สร้างสคีมา Spanner แทน สร้างฐานข้อมูล Spanner ใหม่ที่มีข้อมูลจากฐานข้อมูลต้นทาง และสร้างรายงานการประเมินโดยละเอียด HarbourBridge มีไว้เพื่อการโหลดฐานข้อมูลขนาดไม่เกิน 20-10 GB เพื่อวัตถุประสงค์ในการประเมิน ไม่ใช่การย้ายข้อมูลแบบเต็มขนาด

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

HarbourBbridge สามารถใช้กับโปรแกรมจำลอง SPANer หรือใช้กับอินสแตนซ์ Spanner โดยตรง

README ของ HarbourBridge มีคู่มือการเริ่มต้นใช้งานฉบับย่อแบบทีละขั้นตอนสำหรับการใช้เครื่องมือกับอินสแตนซ์ Spanner

ติดตั้ง HarbourBridge

ดาวน์โหลดเครื่องมือลงในเครื่องแล้วติดตั้ง คุณต้องติดตั้ง golang เพื่อให้การดำเนินการนี้ทำงานได้ การติดตั้งโมดูลที่จำเป็นทั้งหมดในอินสแตนซ์ใหม่อาจใช้เวลาสักครู่โดยไม่ต้องตั้งค่าไว้ก่อนหน้านี้

# Install golang
cd ~
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
sudo tar -zxvf go1.17.2.linux-amd64.tar.gz -C /usr/local
rm go1.17.2.linux-amd64.tar.gz

echo 'export GOROOT=/usr/local/go' | sudo tee -a /etc/profile
echo 'export PATH=/usr/local/go/bin:$HOME/go/bin:$PATH' | sudo tee -a /etc/profile
source /etc/profile

# Install harbourbridge
git clone https://github.com/cloudspannerecosystem/harbourbridge
cd harbourbridge
go run github.com/cloudspannerecosystem/harbourbridge help

ย้ายข้อมูล

ใช้คำสั่งต่อไปนี้เพื่อย้ายข้อมูลฐานข้อมูล Magento ไปยัง Spanner

mysqldump --user='root' --password=$ROOT_PASSWORD magento | go run github.com/cloudspannerecosystem/harbourbridge -driver=mysqldump -dbname=magento

ตั้งค่าเครื่องมือ spanner-cli

go install github.com/cloudspannerecosystem/spanner-cli@latest

3. แปลง Magento ให้ทำงานร่วมกับ Spanner

ตอนนี้ Magento ทำงานอยู่ และอินสแตนซ์ Spanner ที่สร้างขึ้นด้วยฐานข้อมูล Magento ย้ายข้อมูลแล้ว เราจะแก้ไข Magento ให้ทำงานกับข้อมูลที่จัดเก็บไว้ใน Spanner

ระบบจะดำเนินการตามขั้นตอนต่อไปนี้เพื่อแปลงการติดตั้ง Magento

  • โคลนโปรเจ็กต์ magento-spanner-port
  • เปลี่ยนการเชื่อมต่อกับ Spanner
  • ตรวจสอบว่ารายละเอียดแคตตาล็อกมาจาก Spanner

โคลนส้อมของโปรเจ็กต์ Magento

โคลนโค้ดแอปพลิเคชัน PHP สำหรับ Magento ซึ่งมีการปรับแต่งสำหรับโมดูลแคตตาล็อก รายการที่อยากได้ และรถเข็นจาก URL Git ที่ระบุไว้ด้านล่าง

cd ~
git clone https://github.com/searceinc/magento-spanner-port

ไดเรกทอรีหน้าแรกควรมีลักษณะดังนี้

$ ls
go  harbourbridge  magento-spanner-port  magento2

โดยที่ magento2 คือฐานของโค้ดที่เราจะแก้ไขโดยใช้โค้ดจาก magento-spanner-port

เปลี่ยนการเชื่อมต่อเป็น Spanner

หากต้องการตรวจสอบว่าการแก้ไขโค้ดแสดงใน UI หรือไม่ ให้ทำตามขั้นตอนด้านล่าง

ดูตัวอย่างการใช้งานได้ที่ลิงก์ GitHub https://github.com/searceinc/magento-spanner-port

  • ต้องมีไลบรารีไคลเอ็นต์ PHP ของ google/cloud-spanner
  • เพิ่มอะแดปเตอร์ Spanner เพื่อสร้างการเชื่อมต่อกับ Spanner
  • กำหนดค่าอินสแตนซ์ Spanner และข้อมูลเซิร์ฟเวอร์
  • เพิ่ม SpannerInterface และ Spanner ในอะแดปเตอร์เพื่อใช้การเชื่อมต่อกับ Spanner

ก่อนอื่น เราต้องติดตั้งไลบรารี PHP ของ Cloud Spanner โดยใช้ Composer ในไดเรกทอรี magento2 ให้เรียกใช้คำสั่งนี้

cd ~/magento2
composer require google/cloud-spanner

จากนั้นเพิ่มไฟล์อะแดปเตอร์ Spanner จาก magento-spanner-port ลงในโค้ดฐาน magento2 ดังนี้

~/magento2$ cp -r ../magento-spanner-port/lib/internal/Magento/Framework/DB/Adapter/Spanner vendor/magento/framework/DB/Adapter/.
~/magento2$ ls -l vendor/magento/framework/DB/Adapter/Spanner
total 16
-rw-r--r-- 1 derekdowney derekdowney 10378 Nov  9 21:03 Spanner.php
-rw-r--r-- 1 derekdowney derekdowney  2948 Nov  9 21:03 SpannerInterface.php

ตอนนี้ให้แก้ไขไฟล์ DB/Adapter/Spanner/Spanner.php เพื่อป้อนข้อมูลการเชื่อมต่อ Spanner สำหรับ $project_id, $instance และ $database

$ nano vendor/magento/framework/DB/Adapter/Spanner/Spanner.php

class Spanner implements SpannerInterface
{
    /**
     * Google cloud project id
     * @var string
     */
    private $project_id = 'magento';

    /**
     * Google cloud instance name
     * @var string
     */
    private $instance  = 'magento-instance';

    /**
     * Cloud Spanner database name
     * @var string
     */
    private $database  = 'magento';

    /**
     * Is Cloud Spanner emulator
     * @var bool
     */
    private $is_emulator = true;
...
   /**
    * Set database connection adapter
    *
    * @param \Magento\Framework\DB\Adapter\AdapterInterface $conn
    * @return $this
    * @throws \Magento\Framework\Exception\LocalizedException
    */
   public function setConnection(\Magento\Framework\DB\Adapter\AdapterInterface $conn)
   {
       $this->_conn = $conn;
       $this->_select = $this->_conn->select();
       $this->_isOrdersRendered = false;
       return $this;
   }


   /**
     * Set Cloud Spanner database connection adapter
     *
     * @return void
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    private function setSpannerConnection()
    {
        $this->_spanner_conn = new Spanner();
    }

แก้ไขคลาส AbstractDB ภายใน Magento ให้เชื่อมต่อกับ Spanner โดยใช้ฟังก์ชันการเชื่อมต่อที่สร้างขึ้นใหม่ภายในอะแดปเตอร์ Spanner เพิ่มเส้นสีเขียวต่อจากเส้นสีขาวในไฟล์ โปรดดูที่ vendor/magento/framework/Data/Collection/AbstractDb.php

$ nano vendor/magento/framework/Data/Collection/AbstractDb.php
...
use Psr\Log\LoggerInterface as Logger;
use Magento\Framework\DB\Adapter\Spanner\Spanner;
...
    protected $_conn;

    /**
     * Cloud Spanner connection
     *
     * @var \Magento\Framework\DB\Adapter\Spanner\SpannerAdapterInterface
     */
    protected $_spanner_conn;
...
       if ($connection !== null) {
            $this->setConnection($connection);
        }
        $this->setSpannerConnection();
        $this->_logger = $logger;
...
   /**
     * Retrieve connection object
     *
     * @return AdapterInterface
     */
    public function getConnection()
    {
        return $this->_conn;
    }

   /**
     * Retrieve connection object
     *
     * @return SpannerAdapterInterface
     */
    public function getSpannerConnection()
    {
        return $this->_spanner_conn;
    }
...

เมื่อเชื่อมต่อแล้ว เราต้องแก้ไขวิธีการดึงข้อมูลจากอะแดปเตอร์ MySQL เป็นอะแดปเตอร์ Spanner แก้ไขเมธอด _loadAttributes ใน AbstractCollection เพื่อเชื่อมต่อกับ Spanner และดึงข้อมูลจาก Spanner แทนที่เส้นสีแดงด้วยเส้นสีเขียว

โปรดดู /app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php

$ nano ./vendor/magento/module-eav/Model/Entity/Collection/AbstractCollection.php

use Magento\Framework\Exception\LocalizedException;
use Google\Cloud\Spanner\SpannerClient;

...
               try {
                    if (is_array($selects)) {
                        $select = implode(' UNION ALL ', $selects);
                    } else {
                        $select = $selects;
                    }
                   $values = $this->getConnection()->fetchAll($select);
                   $con = $this->getSpannerConnection();

                    /**
                     * Cloud Spanner follows strict type so cast the columns in common type
                     */
                    $select = $con->addCast($select, "`t_d`.`value`", 'string');
                    $select = $con->addCast($select, "`t_s`.`value`", 'string');
                    $select = $con->addCast($select, "IF(t_s.value_id IS NULL, t_d.value, t_s.value)", 'string');
                    
                    $values = $con->fetchAll($select);

...

ตรวจสอบว่าระบบป้อนข้อมูลรายละเอียดแคตตาล็อกจาก Spanner

เท่านี้ก็เรียบร้อย ตอนนี้คุณสามารถไปที่การติดตั้ง Magento ในเบราว์เซอร์และตรวจสอบว่าข้อมูลกำลังโหลดอยู่

ตัวอย่างเช่น รายการต่อไปนี้คือรายการในแคตตาล็อกสำหรับนาฬิกา

13b54ba4482408fc.png

แก้ไขข้อมูล Spanner ผ่านเทอร์มินัลสำหรับผลิตภัณฑ์รายการใดรายการหนึ่ง และค้นหาข้อมูลผ่านเทอร์มินัลเพื่อยืนยันการแก้ไขใน Spanner

$ spanner-cli -pmagento -i magento-instance -d magento
spanner> SELECT * FROM catalog_product_entity_varchar WHERE value LIKE "Aim Analog%";
+----------+--------------+----------+-----------+--------------------+
| value_id | attribute_id | store_id | entity_id | value              |
+----------+--------------+----------+-----------+--------------------+
| 390      | 73           | 0        | 36        | Aim Analog Watch |
+----------+--------------+----------+-----------+--------------------+
1 rows in set (80.711542ms)

spanner> UPDATE catalog_product_entity_varchar SET value = "Aim Analog Spanner" WHERE value_id=390;
Query OK, 1 rows affected (0.19 sec)

spanner> SELECT * FROM catalog_product_entity_varchar WHERE value_id=390;
+----------+--------------+----------+-----------+--------------------+
| value_id | attribute_id | store_id | entity_id | value              |
+----------+--------------+----------+-----------+--------------------+
| 390      | 73           | 0        | 36        | Aim Analog Spanner |
+----------+--------------+----------+-----------+--------------------+
1 rows in set (80.711542ms)

ตอนนี้ ให้โหลดหน้าจออีกครั้งเพื่อยืนยันว่าชื่อนาฬิกาเปลี่ยนเป็น "Aim Analog Spanner" ตามที่ได้อัปเดตผ่านเทอร์มินัล Spanner แล้ว

63a9c7b065c7051f.png

4. ขอแสดงความยินดี

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

กำลังล้างข้อมูล

เมื่อการตั้งค่าและการตรวจสอบ POC เสร็จสมบูรณ์แล้ว คุณอาจต้องการลบทรัพยากร GCP ที่สร้างขึ้นในระหว่างกระบวนการ ซึ่งรวมถึงเครื่องเสมือน Compute Engine และอินสแตนซ์ Cloud Spanner ด้วยหากคุณตัดสินใจที่จะใช้เครื่องเสมือนแทนโปรแกรมจำลอง

ขั้นตอนถัดไปคือ

นี่เป็นเพียงโมเดลต้นแบบสำหรับ POC ของ Spanner

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