Tag Archive PHP

laravel / PHP error 500

เจอ error 500 หลังจาก upload งานที่เขียนโดยใช้ laravel ทั้งๆที่เทสในเครื่องแล้ว หาสาเหตุอยู่นานก็ไม่เจอ

การตรวจสอบขั้นต้นที่เจอในเว็บทั่วๆไปคือ ให้ตั้ง permission ใหม่โดย

  • folder ให้เซ็ตเป็น 755 โดย[code type=”text” title=”chmod”]find . -type d -exec chmod 755 {} \;[/code]
  • และตั้งไฟล์เป็น 644[code type=”text” title=”chmod”]find . -type f -exec chmod 644 {} \;[/code]
  • ถ้าไม่หาย อาจะเพราะ user ที่ run apache กับ ftp หรือ เจ้าของไฟล์เป็นคนละ user กัน ทำให้การทำงานทำได้ไม่สมบูรณ์ แก้ได้โดยคำสั่ง chmod -R o+w โดยถ้าเก็บงานไว้ที่ /colume1/web/CMS_linux ก็ใช้[code type=”text” title=”chmod”]chmod -R o+w /colume1/web/CMS_linux[/code]

    ถ้าไม่เข้าใจอ่าน การเปลี่ยนสิทธิอนุญาตในไฟล์หรือไดเร็กทอรี

จัด code php ตาม PHR 2 สำหรับคนไม่ใช้ PHP7

จากที่เคยเขียนเรื่อง จัด code php ตาม PHR 2 และหลังจากใช้ไปก็เจอปัญหาจึงเขียนเรื่อง phpfmt : PHP 70 or newer is required. จนเจอวิธีแก้ปัญหาจริงๆ

สาเหตุของปัญหาคือ phpfmt มันใช้ PHP 7 ในการจัดรูปแบบแต่ว่า project ที่ทำมีความจำเป็นต้องใช้ PHP 5.6 โดยตัว php-fmt ได้เตรียมทางออกไว้ให้แล้วแต่เพราะว่าไม่ได้หารีบเลยแก้แบบด่วนๆไปก่อน

  1. ไปที่ PHP Downloads โหลด php 7 มาติดตั้ง โดยผมเก็บไว้ที่ C:\php7
  2. เปิด sublime ไปที่ Preference > package settings > phpfmt > Settings – Default จะมีไฟล์ถูกเปิดขึ้นมาก แก้ php_bin ตามตัวอย่าง
    [code language=”text” title=”%APPDATA%\Sublime Text 3\Packages\phpfmt\phpfmt.sublime-settings”]
    {
    "option": "value",
    "php_bin":"C:/php7/php.exe",
    "version": 4
    }
    [/code]

    แค่นี้สามารถใช้ phpfmt จัด code ให้ได้โดยที่ไม่ต้องเปลี่ยนไปใช้ พีเอชพี 7 ได้แล้ว อาจจะปรับแต่งการจัด code ได้โดยไปที่ Preference > package settings > phpfmt > Settings – User แก้ไฟล์ตามตัวอย่าง
    [code language=”text” title=”%APPDATA%\Sublime Text 3\Packages\User\phpfmt.sublime-settings”]
    {
    "autocomplete": true,
    "format_on_save": true,
    "psr1": true,
    "psr2": true,
    "version": 1
    }
    [/code]

จัด code php ตาม PHR 2

ผู้พัฒนา framewordk หลายๆเจ้าช่วยกันออกแบบมาตราฐานการจัด code php ให้เป็นมาตราฐานเดียวกัน จะได้ดูง่าย เรียกว่า coding style guide “PSR” รายละเอียดมีไม่กี่ข้อ ประมาณ 1 หน้า A4 เท่านั้นแต่การที่ต้องมาจัด code ทุกหน้า (วันนี้ผมจัดไป 500 ไฟล์) ก็เยอะไป แถมเสี่ยงที่จะทำผิดพลาดสูง

ใน Sublime Text จะมี plugins ชื่อ phpfmt สามารถช่วยเราจัดรูปแบบให้ทุกครั้งที่บันทึกข้อมูล (^_^)

ถ้าไม่เคยลง package control มาก่อนให้ลง package control ก่อน

  1. โดยไปที่ View > Show Console จะมี กล่องเปิดขึ้นมา
    • sublime 3 ใส่[code lang=”text”]
      import urllib.request,os,hashlib; h = ‘eb2297e1a458f27d836c04bb0cbaf282’ + ‘d0e7a3098092775ccb37ca9d6b2e4b7d’; pf = ‘Package Control.sublime-package’; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( ‘http://packagecontrol.io/’ + pf.replace(‘ ‘, ‘%20’)).read(); dh = hashlib.sha256(by).hexdigest(); print(‘Error validating download (got %s instead of %s), please try manual install’ % (dh, h)) if dh != h else open(os.path.join( ipp, pf), ‘wb’ ).write(by)[/code]
    • หรือ ถ้าใช้ sublime 2 ใส่[code lang=”text”]
      import urllib2,os,hashlib; h = ‘eb2297e1a458f27d836c04bb0cbaf282’ + ‘d0e7a3098092775ccb37ca9d6b2e4b7d’; pf = ‘Package Control.sublime-package’; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( ‘http://packagecontrol.io/’ + pf.replace(‘ ‘, ‘%20’)).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), ‘wb’ ).write(by) if dh == h else None; print(‘Error validating download (got %s instead of %s), please try manual install’ % (dh, h) if dh != h else ‘Please restart Sublime Text to finish installation’)[/code]

  2. รอให้ มี box เตือนขึ้นมาปิดซับลาม แล้วเปิดขึ้นมาใหม่

ลง phpfmt โดย

  1. กด ctrl shift และ P พร้อมกัน จะมี กล่องขึ้นมาด้านบนตรงกลาง
  2. เลือก Package Control: Install Package
  3. เลือก phpfmp

หลังจากลงปลั๊กอินแล้ว เราจะปรับแต่งตัวเลือกต่างๆ ได้ทาง command (มีเยอะมาก) โดยดูได้จาก phpfmtจะใช้ตัวไหนก็ กด ctrl shif p พร้อมกัน แล้วพิมพ์ลงไปได้เลย
ที่ผมใช้คือ

phpfmt: indentation with spaces
ให้ใช้ space ในการเยื้อง code จริงๆผมชอบใช้ tab ในการจัดมากกว่า (อักษรว่าง 4 ตัว แทนได้ด้วยอักษร tab แค่ตัวเดียว source file ของเราจะเล็กลงไปได้เยอะถ้าใช้เท็บ) แต่มาตราฐาน PSR ไม่ให้ใช้ tab ครับ อะไม่เท็บก็ no tab
phpfmt: toggle auto align
ให้มันจัด code อัตโนมัติเลย ไม่ต้องมาสั่งอยู่
phpfmt: toggle autocomplete
ช่วยเติม code ให้เรา
phpfmt: toggle format on save
ปลี่ยนไฟล์เป็น UTF-8 without BOM
phpfmt: toggle PSR2
ใช้ formatt แบบล่าสุด

ดูเพิ่มเติม phpfmt : PHP 70 or newer is required.

จัดระเบียบเซิร์ฟเวอร์

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

  1. จากที่อาจจะมีแค่ joomla อยู่อย่างเดียว ก็จะใส่ phpbb เพิ่มเข้าไป ถ้าไม่ย้ายไฟล์ joomla ไปไว้ใน folder ย่อย ก็ต้องใส่ phpbb ไปใน folder ย่อยเวลาจะเรียกใช้ก็เรียก domain1.com/phpbb  ถ้าไม่ถูกใจ phpMyAdmin ตัวเก่าๆที่ติดมากับโฮสต์ จะใช้ตัวใหม่ก็สร้าง folder phpMyAdmin ขึ้นมา ไปเรื่อยๆ แล้วมันจะมีปัญหาอะไรละ
    • ถ้าจะเปลี่ยนจากจูมล่าเป็น wordpress ก็ต้องมาหาว่า folder นี้เป็นของ joomla นะ ต้องดูให้แน่ใจว่ามันไม่ถูกใช้โดยโป��แกรมอ��่น จะท���้งไว้ก็เสียพื้นที่ไปเปล่าๆ
    • การ update อัตโนมัติของบางโปรแกรมอย่าง prestashop ให้วิธีลบทั้งโฟลเดอร์ออกไปทั้งหมด แล้วแตกไฟล์เข้าไปใหม่ ถ้าใน folder นั้นๆ มีไฟล์ของโปรแกรมอื่นละ มันก็ล่มโดยที่เราไม่รู้ตัว
    • บางครั้งโปรแกรมต้องใช้การ config ที่ต่างกัน อย่าง joomla จะเตือนถ้าพบว่า magic_quotes_gpc  เปิดอยู่ แต่โปรแกรมโบราณต้องเปิดไว้ ถ้าเราก็บแยกโพลเดอร์ก็สามารถใช้ .htaccess เปิดปิดได้ตามความต้องการ
  2. จะสร้างเว็บใหม่ ใช้ joomla เหมือนกัน ไว้ที่เดียวกัน บางครั้งสับสน ว่าโพลเดอร์นี้ เป็นของโดเมนไหน

ถ้าเราเก็บไฟล์โดยใช้รูปแบบ public_html/domain1.com, public_html/domain2.com, public_html/ domain3.com ก็จะแก้ปัญหาข้อ 2 ได้

ในแต่ละ domain ก็แบ่งย่อยเป็น joomla, phpbb อีก ให้โปรแกรมแต่ละตัวแยกอิสระต่อกัน

แต่ การที่จะให้ผู้ใช้ลูกค้าของเราดูเว็บ แบบ http://domain1.com/domain1.com/Joomla คงไม่ดีแน่ ทั้งในเรื่องความสะดวกและ SEO เราสามารถใช้ ไฟล์ .htaccess  point ชี้ root diretory ให้เราใหม่

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ public_html  ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์ ตามตัวอย่างเลยครับ[sourcecode langlage=”text”]
    # BlueHost.com
    # .htaccess main domain to subdirectory redirect
    # Do not change this line.
    RewriteEngine on
    # Change example.com to be your main domain.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    # Change ‘subdirectory’ to be the directory you will use for your main domain.
    RewriteCond %{REQUEST_URI} !^/subdirectory/
    # Don’t change the following two lines.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Change ‘subdirectory’ to be the directory you will use for your main domain.
    RewriteRule ^(.*)$ /subdirectory/$1
    # Change example.com to be your main domain again.
    # Change ‘subdirectory’ to be the directory you will use for your main domain
    # followed by / then the main file for your site, index.php, index.html, etc.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteRule ^(/)?$ subdirectory/index.html [L]
    [/sourcecode] copy คู่มือของเซิร์ฟเวอร์มานั่นละ แต่กลัวลืมเลยขอ note ไว้หน่อยหนึ่ง
  3. แก้ example.com เป็น domain ของเรา แก้ subdirectory เป็นโฟลเดอร์ของเรา
  4. ทดลองเข้า โดเมน domain ของเรา จะพบว่าเราเห็นไฟล์ในโฟลเดอร์ subdirectory อีกชั้นหนึ่งไม่ใช่ ตัว public_html

ปิด magic_quotes ด้วย htaccess

Joomla 3 จะมีปัญหาภาพไม่ขี้น ไม่สามารถติดตั้งได้ เพราะว่าเปิด magic_quotes_gpc ไว้ ถ้าเราไม่สามารถปิด ใน php.ini ได้ (เช่าแชร์เซิร์ฟเวอร์เค้าใช้ต้องทำใจ) หรือมีโปรแกรมโบราณสมัยพระเจ้าหลุยส์ที่สิบสามอยู่ด้วย ทำให้ปิดไม่ได้ เราก็สามารถทำได้ด้วยไฟล์ .htaccess

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ที่เก็บไฟล์จูมล่าไว้ ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์
    [sourcecode language=”text”]
    # disabel magic_quotes for joomla
    php_flag magic_quotes off
    php_flag magic_quotes_gpc off
    php_value magic_quotes 0
    php_value magic_quotes_gpc 0
    [/sourcecode]

คำนวนวันที่ใน PHP

วันนี้เข้าไปแก้งานบนระบบเก่าๆ เลยขอเขียนเตือนความจำเป็นอนุสรณ์ไว้ซะหน่อย
ปัจจุบัน ถ้าต้องการหาวันที่ย้อนหลังจะเขียนตามตัวอย่าง
[sourcecode language=”php”]
$date = new DateTime(‘2012-07-09’);
$date->sub(new DateInterval(‘P3D’));
echo $date->format(‘Y-m-j’);
[/sourcecode]
ซึ่งถ้าใช้กับ php ตัวที่เก่ากว่า 5.3 ลงมาจะมี error
Fatal error: Call to undefined method DateTime::sub() in
แก้ได้โดยไปเขียนแบบเก่าๆ คือ
[sourcecode language=”php”]
$date = strtotime(‘-3 day’ ,strtotime(‘2012-07-09’)) ;
echo date(‘Y-m-j’ ,$date);
[/sourcecode]
ดูเพิ่มเติม