ข้ามไปที่เนื้อหาหลัก

เมื่อต้องติดตั้ง และใช้งาน RdKafka

 เรื่องของเรื่อง คือ มี Task ที่ต้องใช้งาน Kafka บน PHP และมีการทำในส่วนของ Authentication เพิ่มเติมด้วย SASL เรื่องราวดูไม่น่าตื่นเต้นอะไร แต่เมื่อเราพบว่า Package ที่ใช้อยู่นั้นยังไม่ได้ Release feature นี้

ทำให้เราต้องรีบควานหา Package ตัวใหม่ซึ่งเราก็ไปเจอเข้ากับตัวนี้เข้า

สิ่งที่กลายมาเป็นปัญหา คือ เรื่องของการติดตั้ง เพราะดูเหมือนว่า RdKafka นั้นมีอะไรแอบแฝงอยู่ ซึ่งต้องทำใจร่มๆ แล้วนั่งอ่านให้ละเอียดก่อนจะเข้าใจว่า PHP RdKafka นั้นเป็น Kafka Client ที่ถูกพัฒนาโดยมี core หลักจาก libkafka

แปลว่าก่อนที่เราจะติดตั้ง PHP RdKafka ด้เราจำเป็นจะต้องติดตั้ง libkafka ก่อน

แล้วไหนล่ะปัญหา?

ปัญหา คือ dev environment ของเราใช้ container แต่ production และ staging ยังคงเป็น Server แบบ Bare metal เพราะงั้นการติดตั้งก็จะแตกต่างกันออกไป เนื่องด้วยเพราะความรีบ และไม่ค่อยมีสติ ทำให้งมอยู่นาน เมื่อทำได้แล้วก็เลยอยากมาแชร์ เผื่อใครกำลังติดหลุมเดียวกันจะได้ไม่ต้องจมอยู่กับมันนาน 555+

การติดตั้งบน Docker

โชคดีที่มาเจอกันช้าไป เพราะก่อนหน้านี้การติดตั้ง RdKafka บน Alpine นั้นต้องมีกรรมวิธีเยอะมาก คือ ต้อง clone repository มาแล้ว make install เอง แต่ปัจจุบันสามารถทำได้เลยง่ายๆ

FROM php:8.0-fpm-alpineARG RDKAFKA_VERSION="5.0.0"RUN apk add --no-cache --virtual .persistent-deps \
librdkafka
RUN set -xe \
&& apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \
librdkafka-dev \
&& pecl install rdkafka-${EXT_RDKAFKA_VERSION} \
&& docker-php-ext-enable rdkafka \
&& apk del -f .build-deps \
&& rm -rf /var/cache/apk/*
....

การติดตั้งบน Server ที่เป็น Bare Metal

sudo apt-get install libkafka-dev -y
sudo pecl install rdkafka
// เอาด้านล่างไปใส่ใน php.ini เพื่อ enable extension
extension=rdkafka.so

ข้อควรระวัง เมื่อคุณเจอปัญหา PHP ไม่สามารถที่จะ Compile หรือไม่สามารถโหลดใช้งาน extension ได้ ในช่วงระหว่างที่ติดตั้งถ้าเจอ warning message ด้านล่าง

WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update

ให้รันคำสั่ง pecl channel-update pecl.php.net เพื่ออัพเดท pecl ให้โหลด package ตัวล่าสุดมา จะสามารถช่วยแก้ปัญหาการติดตั้งได้ในระดับหนึง

หมดแล้วคร้าบบบบบ หวังว่าบทความนี้จะช่วยให้ใครที่หลงมาอ่านสามารถติดตั้งได้นะครับ :)

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเพิ่ม Font ภาษาไทยอื่นๆ เข้าไปใช้งานใน MPDF

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

การใช้งาน คำสั่ง file_exists() อย่างเข้าใจ

นี่อาจจะไม่เรื่องใหม่อะไรสำหรับ Professional ทั้งหลาย แต่ว่าสำหรับผมที่เข้าใจ และใช้งานอย่างผิดๆ มาตลอด จนบางทีก็เข้าใจว่า เราเขียนผิด หรือ คำสั่งมันใช้งานไม่ได้ วันนี้จะขอมาพูดถึงเรื่องของคำสั่ง PHP ที่ชื่อ file_exists เป็นคำสั่งที่ใช้สำหรับตรวจสอบไฟล์ว่ามีอยู่จริงหรือไม่? ตัวอย่างการใช้งานแบบผิดๆ ที่ผมใช้ก็คือ file_exists('/images/news/helloworld.jpg'); ผลลัพธ์ที่ได้คือ FALSE ถึงแม้ว้าจะมีไฟล์นั้นอยู่จริงก็ตาม ซึ่งในความเป็นจริงแล้ว การใช้งานที่ถูกต้องคือ file_exists($_SERVER['DOCUMENT_ROOT'] . '/images/news/helloworld.jpg'); จากตัวอย่างที่ถูกต้อง ทำให้เข้าใจแบบง่ายๆ ว่าคำสั่ง file_exists นั้นใช้สำหรับเช็ค path ในโฟลเดอร์จริงๆ เท่านั้น ไม่สามารถเช็คจาก URL ได้ อันนี้เป็นเรื่องง่ายๆ ที่ผมเข้าใจผิดมาอยู่นานเลยทีเดียวเลยต้องขอลงบันทึกเตือนตัวเองไว้อีกที :3

มาเข้าใจ และใช้ Datatable ดึงข้อมูลแบบ Server-side ด้วย PHP, MySQL กันเถอะ

มีช่วงหนึงผมเคยนำ datatable มาพัฒนาในงานแต่เกิดปัญหาเนื่องจากมีข้อมูลขนาดใหญ่ ทำให้เกิดการโหลดในครั้งแรกที่โหลดหน้าเพจนั้นๆ เนื่องจากผมใช้ Ajax ในการโหลดข้อมูลทั้งหมดมาในครั้งเดียวด้วยจำนวนข้อมูล 1000 ขึ้น ซึ่งตอนนั้นผมคิดว่าการทำ preload น่าจะช่วยได้ แต่ว่าถ้า user เกิดเผลอไปกด refesh หรือแก้ไขข้อมูลเวลากลับมาที่หน้าข้อมูลก็ต้องโหลดใหม่อีก ทำให้ผมเลิกใช้ datatable ไปเลย เพราะคิดว่ามันคงไม่เหมาะ แต่ในความจริงแล้ว datatable ก็ได้มีสิ่งที่มาแก้ในจุดนั้นได้ ซึ่งเรียกว่า server-side โดยการที่อนุญาตให้เรา query ข้อมูลออกมาก่อนแล้วส่งมาให้ datatable อ่านข้อมูลในจำนวนที่น้อยลง หลักการก็เหมือนๆ กับบทความการทำสร้าง XML จากข้อมูลขนาดใหญ่นั่นแหละครับ แต่มีเงื่อนไขเพียงแต่ว่า ต้อง Filter และส่งข้อมูลออกมาในรูปแบบที่ตรงตามหลักของ datatable เท่านั้น ( บางครั้งเวลาเข้าไปอ่าน Document หรือดู Example จะงงๆ ว่าอะไรเยอะแยะ ) โดยวันนี้จะมาแนะนำการใช้งานแบบง่ายๆ กันเลย :D