26 items(1/3) 2 3 Next » Last »|

macOS 12 Monterey: Web Server Setup/Apache/MariaDB/PHP Multiple Versions

โดย Little Bear on 4 ต.ค. 64 14:48


Install Apache

Location of Apache config file is /opt/homebrew/etc/httpd/httpd.conf Change www home folder

mv /opt/homebrew/var/www /opt/homebrew/var/www.bak
ln -s /Users/httpdocs /opt/homebrew/var/www
brew services restart apache2

brew tap shivammathur/php


brew install shivammathur/php/php@5.6
brew install shivammathur/php/php@7.0
brew install shivammathur/php/php@7.1
brew install shivammathur/php/php@7.2
brew install shivammathur/php/php@7.3
brew install shivammathur/php/php@7.4
brew install shivammathur/php/php@8.0
brew install shivammathur/php/php@8.1
brew install shivammathur/php/php@8.2

Mac M1 : Config file อยู่ที่


Mac Intel : Config file อยู่ที่



To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module /usr/local/opt/php@7.4/lib/httpd/modules/

<FilesMatch .php$>
    SetHandler application/x-httpd-php

Finally, check DirectoryIndex includes index.php DirectoryIndex index.php index.html

The php.ini and php-fpm.ini file can be found in: /usr/local/etc/php/7.4/

php@7.4 is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula.

If you need to have php@7.4 first in your PATH, run: echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.zshrc echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc

For compilers to find php@7.4 you may need to set: export LDFLAGS="-L/usr/local/opt/php@7.4/lib" export CPPFLAGS="-I/usr/local/opt/php@7.4/include"<br /> <br /> <br /> To start shivammathur/php/php@7.4: brew services start shivammathur/php/php@7.4 Or, if you don't want/need a background service you can just run: /usr/local/opt/php@7.4/sbin/php-fpm --nodaemonize


brew unlink php && brew link --overwrite --force php@7.4


แก้ไขไฟล์ /opt/homebrew/etc/httpd/httpd.conf /etc/apache2/httpd.conf หรือ /usr/local/etc/httpd/httpd.conf file scroll to the bottom of the LoadModule entries.

 LoadModule php5_module /usr/local/opt/php@5.6/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php7_module /usr/local/opt/php@7.0/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php7_module /usr/local/opt/php@7.1/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php7_module /usr/local/opt/php@7.2/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php7_module /usr/local/opt/php@7.3/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php7_module /usr/local/opt/php@7.4/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php_module /usr/local/opt/php@8.0/lib/httpd/modules/
 <a class="hashtag" href="/tags/LoadModule">#LoadModule</a> php_module /usr/local/opt/php@8.1/lib/httpd/modules/

ใช้ sphp เป็นตัวเปลี่ยน version จะสะดวกกว่า

curl -L > /opt/homebrew/bin/sphp
chmod +x /opt/homebrew/bin/sphp
sphp 8.1

Install MariaDB

brew install mariadb

Restart MariaDB

Auto start

brew services start mariadb

Manual start

mysql.server restart

Location of database is /opt/homebrew/var/mysql, If you want to change use symbolic link to new location

brew services stop mariadb
cp -R /opt/homebrew/var/mysql /Users/mysql
mv /opt/homebrew/var/mysql /opt/homebrew/var/mysql.bak
mkdir /opt/homebrew/var/mysql
ln -s /Users/mysql /opt/homebrew/var/mysql
brew services start mariadb

MariaDB Configuration

แก้ไขไฟล์ /opt/homebrew/etc/my.cnf.d/my.cnf

  # Avaliable Mode<br />
default-storage-engine = MYISAM
character-set-server = utf8
  <a class="hashtag" href="/tags/collation">#collation</a>-server = utf32unicodeci

หากไม่ต้องการให้ตรวจสอบการบันทึกข้อมูลของฟิลด์ เช่น ข้อมูลยาวเกินกว่าที่กำหนดในฟิลด์ ให้กำหนด mode เป็น NOFIELDOPTIONS


Ubuntu Server Installation

โดย Little Bear on 26 พ.ค. 64 13:02

ติดตั้ง Server ใหม่ของ Ubuntu Server เขียนบันทึกคำสั่งไว้สักหน่อย

Apache Installation

sudo apt update
sudo apt upgrade

sudo apt install apache2 -y
systemctl status apache2

sudo a2dismod ssl
sudo a2enmod ssl
sudo a2enmod rewrite

Apache config

sudo nano /etc/apache2/sites-available/000-default.conf

เพิ่ม AllowOverride Al

<Directory /home/>
        Options Indexes FollowSymLinks
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
        Require all granted

sudo apt-get install mariadb-server mariadb-client
systemctl status mariadb

sudo nano /etc/mysql/conf.d/mysqld.cnf sudo systemctl restart mysql

debian : service mysqld restart

กรณีที่ติดตั้ง mariadb แล้วไม่ได้กำหนดรหัสของ root

mysql --version

systemctl stop mariadb systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking" systemctl start mariadb mysql -u root

mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR 'root'@localhost = PASSWORD("newpassword"); mysql> quit

sudo systemctl unset-environment MYSQLD_OPTS sudo systemctl restart mariadb

mysql -u root -p

mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; mysql> GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

#MySql Config

ตรวจสอบว่าควรกำหนดค่า keybuffersize สักเท่าไหร่ดี

    -> IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
    -> SUBSTR(' KMG',IF(PowerOf1024<0,0,
    -> IF(PowerOf1024>3,0,PowerOf1024))+1,1))
    -> recommendedkeybuffersize FROM
    -> FROM (SELECT SUM(indexlength) KBS1
    -> FROM informationschema.tables
    -> WHERE engine='MyISAM' AND
    -> tableschema NOT IN ('information_schema','mysql')) AA ) A,
    -> (SELECT 2 PowerOf1024) B;

name /etc/my.cnf
 <a class="hashtag" href="/tags/MyISAM">#MyISAM</a>
join_buffer_size=256K  # from 140M for row pointers
thread_cache_size=40  # from 8 to avoid thread starvation
query_cache_limit=8M  # from 4M since you have QC turned OFF
key_cache_age_threshold=7200  # from 300 seconds to reduce key_reads RPS
key_cache_division_limit=50  # from 100 percent for HOT/WARM caches
key_cache_block_size=16K  # from 1K to evict bigger block when full
open_files_limit=30000  # from 1024 to reduce opened_files RPS
table_open_cache=10000  # from 407 to reduce opened_tables RPS
table_definition_cache=2000  # from 603 to reduce opened_table_definitions RPS
max_heap_table_size=48M  # from 32M  for additional capacity
tmp_table_size=48M  # from 32M to reduce created_tmp_disk_tables count
innodb_io_capacity=1600  # from 200 to allow more IOPS
read_rnd_buffer_size=192K  # from 256K to reduce handler_read_rnd_next RPS
sort_buffer_size=2M  # from 256K to reduce sort_merge_passes count

 <a class="hashtag" href="/tags/Innodb">#Innodb</a>
<a class="hashtag" href="/tags/innodb">#innodb</a>_buffer_pool_size = 6144M
innodb_log_file_size = 512M
innodb_lru_scan_depth=100  # from 1024 to reduce CPU busy every SE$

max_connections = 500
key_buffer_size = 512M

ติดตั้ง PHP => How to install PHP 7.4 on Ubuntu 22.04 LTS Jammy Linux

sudo apt update && sudo apt upgrade
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php -y

sudo apt install php7.4
sudo apt install php7.4-{cli,common,curl,zip,gd,mysql,xml,mbstring,json,intl}

sudo update-alternatives --config php

sudo apt-get install php7.4 php7.4-mysql php-common php7.4-cli php7.4-json php7.4-common php7.4-opcache libapache2-mod-php7.4

sudo nano /etc/php/7.4/fpm/php.ini

sudo systemctl restart apache2
sudo systemctl restart mysql

wget -r --ask-password

Install phpMyAdmin

sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

Mount volumn จาก server เดิม มาไว้ใน server ใหม่ เพื่อทำการ copy file

sudo apt install sshfs

mkdir folder
sshfs -p 22 folder

ใช้งานเสร็จก็ un mount

umount folder



Bug : isset($body['location']) ดันเป็นจริงเมื่อ $body ไม่ใช่ array

โดย Little Bear on 9 ธ.ค. 57 10:56

งมหาเรื่องแปลกอยู่หลายอาทิตย์ วันนี้เลยตามหาว่าเกิดอะไรขึ้นกับโปรแกรม PHP ที่เขียนบน Linux และไม่เคยทดสอบบน Windows เมื่อเอามาติดตั้งก็เลยเกิด error แปลก

ปรากฏว่า คำสั่ง isset($body['location']) ดันเป็นจริงเมื่อ $body ไม่ใช่ array ทำให้เช็คเงื่อนไขผิดพลาด

แก้ไข : ตรวจสอบด้วยว่าเป็น array หรือไม่

if ( is_array($body) && isset($body['location']) ) then ;Do something

MVC - แนวคิดเกี่ยวกับ MVC

โดย Little Bear on 6 ก.ค. 56 12:22

กำลังศึกษาเรื่อง Model View Control (MVC) หลังจากที่เคยอ่านเรื่องนี้มานานเป็นปี ๆ แล้ว และได้นำมาประยุกต์ใช้นิดหน่อย แต่ยังไม่เข้าใจอย่างลึกซึ้ง เลยขอมานั่งทำความเข้าใจอย่างละเอียดอีกสักรอบ หลังจากนี้ก็จะพยายามรวบรวมเรื่องราวของ Model View Control มาเก็บไว้เรื่อย ๆ

เริ่มกันที่แนวคิดของ MVC ก่อนนะครับ

ในยุคนี้คงไม่มีทางที่เราจะหนีคำนี้ได้พ้นเพราะในการพัฒนาระบบในปัจจุบันขนาดของโครงการจะใหญ่ขึ้นเรื่อยๆ เนื่องจากความต้องการมีสูงขึ้นเรื่อยๆ ดังนั้นการจะพัฒนา software ด้วยตัวคนเดียวเป็นเรื่องยาก จึงมีการประยุกต์ใช้งาน Enterpirse Architecture Pattern อย่าง MVC กันมากขึ้นในทุกๆ platform ด้วยเหตุนี้การจะใช้งาน MVC Framework ตัวใดก็แล้วแต่ไม่ว่าจะเป็น PHP , .NET หรือ Java ล้วนแล้วแต่ต้องอาศัยแนวความคิดที่ถูกต้องจึงจะเป็นประโยชน์อย่างแท้จริงไม่เช่นนั้นนอกจากจะไม่มีประโยชน์ใดๆ ในการใช้ Framework แล้ว ยังเป็นดภาระในการแก้ไขซึ่งจะทำให้แก้ไขได้ยากกว่าปกติ ดังนั้นจึงเริ่มจากการแนะนำแนวคิดในการแบ่งแยกส่วนของ code ออกเป็น 3 ส่วนด้วยกันคือ

 คำอธิบายภาพ : mvc

MVC Archtecture Pattern

Model (M) เป็นส่วนของ Business Logic และ ส่วนของ Entity ซึ่งส่วนนี้จะแตกต่างจากแนวคิดแบบ 3-tier ซึ่งจะแยกส่วนล่างสุดเป็น Data Access Layer (DAL) ซึ่งจะทำหน้าที่ติดต่อกับ Database เท่านั้น แต่ Model จะไม่ได้เป็นเพียงแครการติดต่อกับ Database เท่านั้น แต่ยังรวมเรื่องของ Business Logic ต่างด้วย เช่น การคำนวน VAT 7% หรือการคำนวนค่าต่างให้อยู่ในชั้นนี้ และถ้าจะให้ดีชั้นนี้ควรจะทำการสร้าง Service Layer ขึ้นมา ตรงนี้จะลงรายละเอียดในบทความถัดไป

View (V) เป็นส่วนของการแสดงผลอันนี้ตรงตัวไม่ต้องคิดมาก เป็นส่วนของ HTML ,CSS และ JavaScript ในการทำ Web Application แต่ถ้าเป็น Windows Application ก็จะเป็นพวก forms ต่างๆ ในการใช้งาน PHP Framework บางตัวจะพ่วงเอา Template Engine มาให้ใช้งานด้วย เช่น Symfony จะมี Twig เป็น Template Engine ซึ่งข้อดีของการใช้งาน Template Engine ก็คือจะทำการแยกส่วนของการแสดงผลกับ logic ได้ชัดเจนมากขึ้นคนที่ทำ HTML CSS และ JavaScript ไม่จำเป็นต้องเขียน PHP ได้

Controller (C) ส่วนนี้เป็นส่วนสมองของระบบจะทำหน้าที่คอยควบคุมว่าจะดึงข้อมูลจากไหน (Model ตัวไหน) แล้วก็ไปแสดงผลยังไง (View ตัวไหน) ส่วนนี้จะเป็นส่วนที่่ผิดกันเป็นประจำสำหรับผู้ที่เริ่มใช้งาน MVC Framework เพราะเป็นส่วนที่เราไม่เคยแยกส่วนนี้มาก่อน ส่วนของ Controller จะเป็น work flow หรือขั้นตอนการทำงานต่างๆ (มีเฉพาะ flow ของการทำงานเท่านั้น) จะไม่มี logic ใดๆในนี้ไม่มีการเขียน HTML ไม่มีการคำนวนค่าต่างๆ หน่าที่ของ Controller มีเพียงแค่รับค่ามาทำการ Validate แล้วส่งเข้าไปที่ Model เท่านั้น

ประโยชน์ของการใช้ MVC ก็คือการเพิ่ม maintainability หรือทำให้ระบบแก้ไขได้ง่ายขึ้นเพราะมันแยกส่วนออกจากกันอย่างชัดเจน อีกข้อนึงที่สำคัญไม่แพ้กันก็คือเราจะสามารถแยกคนทำงานตามสิ่งที่เค้าถนัด เช่น คนทำ View ไม่ต้องรู้ว่า database มีโครงสร้างยังไง คนที่ทำผั่ง model ก็ไม่ต้องมากังวลเรื่องของการแสดงผล แต่ขอให้ตกลงเรื่องของ data ที่ส่งหากันให้ดีก็พอ

สุดท้ายอาจไม่จำเป็นจะต้อง strict อยู่ในรูปแบบนี้ 100% เพราะนี่เป็นเพียงทฤษฏี แต่ยังไงก็ตามถ้าจะเขียนผิดไปจากนี้ (anti pattern) ก็สามารถทำได้แต่ต้องแน่ใจว่าการทำแบบนั้นมีเหตุผลมากพอที่จะทำ และไม่กระทบกับการแก้ไขในอนาคต

ที่มา :

FTP chmod

โดย Little Bear on 16 พ.ค. 56 18:20

เหตุเกิดจากว่า server ที่วางอยู่ใน ม.อ. ไม่อนุญาตให้ FTP จากภายนอกมหาวิทยาลัยได้ ต้องเข้าไปนั่งในมหาวิทยาลัยเท่านั้นจึงจะใช้งาน FTP ได้

แต่เว็บที่ดูแลอยู่มีปัญหาแค่ว่า folder สำหรับ upload ไฟล์นั้นได้ถูกกำหนด permission ไว้ที่ 755 ทำให้ไม่สามารถบันทึกภาพไว้ได้

นั่งคิดอยู่หลายตลบว่าจะทำยังไงดี ไม่อยากบึ่งรถไป ม.อ. ก็มาคิดได้ว่า CMS ที่เขียนไว้นั้น สามารถ run PHP ได้ และ PHP ก็มี function ftp และ ftp_chmod


$ftp_server = "";
$ftp_user_name = "myftpusername";
$ftp_user_pass = "myfppassword";

$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);


if (ftp_chmod($conn_id, 0777, $folder) !== false) {
 echo "$folder chmoded successfully to 777\n";
} else {
 echo "could not chmod $folder\n";


Hash & Salt

โดย Little Bear on 3 ธ.ค. 55 11:27

มีโครงการที่จะปรับปรุงการเข้ารหัสผ่าน อ่านดูแล้ว นี่ Understanding Hash Functions and Keeping Passwords Safe ก็เป็นวิธีหนึ่ง ที่น่าจะโอเค


ได้ข้อมูลมาจาก PHP: ระบบสมาชิก - สมัครสมาชิก

Regular Expression - ยังไง ยังไง ก็ใช้ไม่ถูกสักที

โดย Little Bear on 19 ต.ค. 55 00:33

การใช้ Regular Expression ใน PHP - คำว่า  Regular expressions ดูเหมือนจะเป็นคำที่น่ากลัวเอามาก ๆ สำหรับนักโปรแกรมมือใหม่ หลายคนไม่อยากรู้จักมันเลยเสียด้วยซ้ำ แต่ขอบอกว่า จริง ๆ แล้วมันไม่ยากแล้วก็มีประโยชน์มากด้วย ไม่ว่าจะเป็น JavaScript หรือ Perl ต่างก็ใช้กันทั้งนั้น จึงไม่เสียหาย ถ้าจะทำความรู้จักกับมันไว้บ้าง

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

เห็นไหมล่ะว่า Regular expression มีประโยชน์อย่างไร

Regular expression คืออะไร?


ขออนุญาต Penthai นำมาเผยแพร่นะครับ

PHP : How to show Adsense on web

โดย Little Bear on 18 ก.ค. 55 09:16

วิธีเอาข้อมูลจาก Google Adsense มาแสดงบนหน้าเว็บของเรา

PHP : Send SMS by

โดย Little Bear on 3 เม.ย. 55 16:57
function smsnotify($mobile_no,$msg,$sender) {
    $user_id    = "gatewayusername";
    $passwd = "gatewaypassword";
    $host       = "";<br />
    $port       = "80";<br />
    $path   = "/api_sms.jsp";

    if ( $fp) {
        fputs($fp,"POST $path HTTP/1.1\r\n");
        fputs($fp,"Host: $host\r\n");
        fputs($fp,"Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp,"Content-length: ".strlen($data)."\r\n");
        fputs($fp,"Connection: close\r\n\r\n");
        while(!feof($fp)) {
$msg='This is a SMS message';

ปล. ยังไม่ได้ทดสอบนะจ๊ะ


Directadmin PHP path

โดย Little Bear on 7 พ.ย. 54 00:17

ไม่มีอะไรมาก แค่อยากบันทึกว่า เวลาเขียน script ภาษา php แล้วต้องการ run ด้วย crontab ซึ่งจะต้องระบุ path ของ php ให้ถูกต้อง ไม่อย่างนั้นมันก็จะ run ไม่ได้

ซึ่ง path ของ php ของ Directadmin ก็คือ /usr/local/bin/php และก็แค่นั้นเอง

26 items(1/3) 2 3 Next » Last »|