Thursday, October 14, 2021

Handle web page caching Codeigniter 4

  • เริ่มหัดใช้ ci เขียน php แต่ติดปัญหาเรื่องแก้ design แล้ว ทำไมหน้ามันไม่ยอมเปลี่ยนหว่า

Solved

  • เพิ่มโค้ดบรรทัดนี้ ใน controller ที่ต้องการให้แสดงผลตามโค้ดใหม่

$n = 1;

$this->cachePage($n); 

  • ค่า n ใช้ได้น้อยสุดเป็น 1 หว่า ซึ่งค่านี้คือ หน่วยเป็น second คือ อายุ cache แค่ 1 วินาที่

Ref

  • https://codeigniter.com/user_guide/general/caching.html?highlight=cache%20page


Config environment Codeigniter 4

วิธีแรกใน base dir แก้ไข env

  • คัดลอกไฟล์ env ไปเป็น .env

$ sudo cp env .env

  • จากนั้นเพิ่มคอนฟิกประมาณนี้

CI_ENVIRONMENT = development 

# CI_ENVIRONMENT = production 

วิธีที่ 2 ใน base dir เหมือนเดิม แก้ไข .htaccess (Apache)

  • .htaccess เพิ่มคอนฟิกประมาณนี้ ในบรรทัด ท้ายสุด

SetEnv CI_ENVIRONMENT development

วิธี 3 ใน base dir แก้ไข index.php

  • เพิ่ม code ใน index.php ประมาณนี้

define("ENVIRONMENT", "development");

Ref

  • https://codeigniter.com/user_guide/general/environments.html 
  • https://www.learnphponline.in/change-codeigniter-environment-variable/

Set MySQL connection Slim framework 4

  • config 2 file app/settings.php and app/dependencies.php

app/settings.php

 "db" => [
                    'driver' => 'mysql',
                    'host' => 'localhost',
                    'username' => 'root',
                    'database' => 'slim_test',
                    'password' => '',
                    'charset' => 'utf8mb4',
                    'collation' => 'utf8mb4_unicode_ci',
                    'flags' => [
                        // Turn off persistent connections
                        PDO::ATTR_PERSISTENT => false,
                        // Enable exceptions
                        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                        // Emulate prepared statements
                        PDO::ATTR_EMULATE_PREPARES => true,
                        // Set default fetch mode to array
                        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                    ],
                ],


 app/dependencies.php

PDO::class => function (ContainerInterface $c) {
 
            $settings = $c->get(SettingsInterface::class);
 
            $dbSettings = $settings->get('db');
 
            $host = $dbSettings['host'];
            $dbname = $dbSettings['database'];
            $username = $dbSettings['username'];
            $password = $dbSettings['password'];
            $charset = $dbSettings['charset'];
            $flags = $dbSettings['flags'];
            $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
            return new PDO($dsn, $username, $password);
        },

ทดสอบใน app/routes.php

 $app->get('/db-test', function (Request $request, Response $response) {
        $db = $this->get(PDO::class);
        $sth = $db->prepare("SELECT * FROM user ORDER BY id desc limit 100");
        $sth->execute();
        $data = $sth->fetchAll(PDO::FETCH_ASSOC);
        $payload = json_encode($data);
        $response->getBody()->write($payload);
        return $response->withHeader('Content-Type', 'application/json');
    });    
};

Ref

  • https://arjunphp.com/how-to-connect-to-mysql-database-in-slim-framework-4/
  • https://odan.github.io/2020/04/05/slim4-multiple-pdo-database-connections.html

Tuesday, October 12, 2021

Body parsing และ Json response สำหรับ Slim 4

  •  ประเด็นคือ client ส่งค่าแบบ json body มา content-type เป็น application/json
  • ใน slim 3 การรับที่ฝั่ง method ก็ง่ายๆ คือ สมมุติเราส่ง json body เป็น

{"user":"a", "age":4}

  • การรับค่าที่ฝั่ง method ใน slim framework 3 จะประมาณนี้

$data = $request->getParsedBody();    

$tmp = $data["your_param_name"]; 

return $response->withJson($result, 200);

  • แต่ใน ฝั่ง Slim 4 ต้องเพิ่มคอนฟิกประมาณนี้ใน index.php หรือ ใน routes.php 

$app->addBodyParsingMiddleware();

$app->addRoutingMiddleware();

$app->addErrorMiddleware(true, true, true);


  • อันนี้ที่ index.php


  • และอันนี้ app/routes.php


$data = $request->getParsedBody();

// $data = array('name' => 'Bob', 'age' => 40);

$payload = json_encode($data);

$response->getBody()->write($payload);

return $response->withHeader('Content-Type', 'application/json')->withStatus(200);

Ref

  • https://www.slimframework.com/docs/v4/middleware/body-parsing.html
  • https://www.slimframework.com/docs/v4/objects/response.html#returning-json

ติดตั้ง CodeIgniter 4 บน Ubuntu 20.04

Env

  • CodeIgniter 4
  • Ubuntu 20.04
  • LAMP
  • PHP 7.4 
  • domain site => www.mysite.com
  • path web root => /var/www/html

แบบ 1 download zip

  • ไปที่ https://codeigniter.com/download
  • เราจะได้ zip file มาแบบนี้ framework-4.1.4.zip (ณ วันที่ 12 ต.ค. 64 ได้เวอร์ชั่นนี้)

  • ใน zip file จะมี folder เดียวชื่อประมาณ framework-4.1.4  และใน folder นี้ก็จะมี subfolder และ file ประมาณภาพตัวอย่าง
  • จากนั้นให้คัดลอกไฟล์ framework-4.1.4 ไปวางไว้ web root path
  • rename framework-4.1.4 เป็น ci4

แบบที่ 2 ใช้ composer 

  • เปลี่ยนพาธไป ที่ web root path ก่อน

$ cd /var/www/html

  • จากนั้นใช้คำสั่งนี้และลงท้ายด้วยชื่อ project folder เรา ในที่นี้คือ  ci4

$ composer create-project codeigniter4/appstarter ci4

ทั้ง 2 วิธีติดตั้งนี้ พาธเว็บเมื่อเข้าใช้งานก็จะเป็น subfolder และ เข้าพาธแบบนี้ www.mysite.com/ci4

  • ในพาธระดับเดียวกับ folder app จะมีไฟล์ env  อยู่ให้เรา คัดลอกเนื้อหาในไฟล์ แล้วสร้างไฟล์ใหม่ชื่อ .env สำหรับ คอนฟิกของระบบ ตัวอย่างเช่น config environment ที่ต้องใช้จะมีหลักๆ 2 แบบ ที่ชอบใช้ คือ development เอาไว้แสดง error ว่าอยู่บรรทัดใหน และ เมื่อพัฒนาเสร็จก็เปลี่ยนโหมดเป็น production เอาไว้ปิดบังบั๊ก ประมาณนั้น
# CI_ENVIRONMENT = production
CI_ENVIRONMENT = development
  • จากนั้นเปลี่ยน permission folder ci4/writable เป็น 777

$ sudo chmod -R 777 /var/www/html/ci4/writable

  • จากนั้นสร้างไฟล์ .htaccess ใน ci4

$ sudo nano /var/www/html/ci4/.htaccess

  • และเพิ่มค่าแบบนี้

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

  • ทดสอบเว็บทำงานได้หรือยัง โดยไปที่ www.mysite.com/ci4 หรือ www.mysite/ci4/public

เพิ่มเติม(แนะนำวิธีเพิ่มเติม)

  • อีกวิธีทำ subfolder site โดยไม่ต้องสร้าง .htaccess ใหม่ 
  • ให้เราทำโดย คัดลอก index.php และ .htaccess ใน public folder ออกมาไว้ใน ci4  เลย
  • ให้อยู่ในระดับเดียวกับ app public folder เป็นต้น 
  • จากนั้นแก้ไขไฟล์ index.php ที่อยู่ใน ci4 

// $pathsConfig = FCPATH . '../app/Config/Paths.php';
$pathsConfig = FCPATH . '/app/Config/Paths.php';

อีกเรื่องที่สำคัญคือ  timezone  ปรับให้เป็นของ thai เราด้วย

  • app/Conifg/App.php

  • เปลี่ยนจาก America/Chicago เป็น Asia/Bangkok
  • ปัญหาที่เกิดถ้าเราไม่เปลี่ยน timezone เป็นของ thai เรา คือ php datediff จะตกไป 1 วันทันที

ปัญหาที่พบในการทำ subfolder ci4 ภายใต้ root

  • ใน config httpd เราตั้งพาธ root เป็น /var/www/site.com/html/
  • แต่เราดันเอา ci4 site เราไปวางไว้ที่ /var/www/site.com/ci4/ แบบนี้ การ route url ผิดเพี้ยนมากเลย
  • ต้องเอา ci4 ไว้ใน /var/www/site.com/html/ci4 แบบนี้จะไม่มีปัญหา
  • แต่ปัญหาทั้งหมดนี้จะหมดไป ถ้าเราตั้งค่า root folder ไปที่   ci4 folder เราเลย

Ref

  • https://onlinewebtutorblog.com/complete-codeigniter-4-basics-tutorial/
  • https://codeigniter4.github.io/userguide/installation/installing_composer.html
  • https://www.positronx.io/codeigniter-crud-with-bootstrap-and-mysql-example/
  • https://akrabat.com/running-slim-4-in-a-subdirectory/
  • https://www.slimframework.com/docs/v4/start/web-servers.html
  • https://www.codebee.co.th/labs/codeigniter-4-%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%a5%e0%b8%9a-public-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b8%88%e0%b8%b2%e0%b8%81-url/
  • https://onlinewebtutorblog.com/codeigniter-4-session-library/

Monday, October 11, 2021

ทำ subdirectory สำหรับ Slim framework 4 อีกวิธี

Related

  • http://juuier.blogspot.com/2021/10/slim-framework-4-ubuntu-2004.html

วิธีแรกได้เขียนไว้แล้ว 

  • คือ เพิ่ม .htaccess บน parent folder ของ public  เพิ่ม

RewriteEngine on

RewriteRule ^$ public/ [L]

RewriteRule (.*) public/$1 [L]

  • และแก้ไขไฟล์ public/index.php หรือ app/routes.phpโดยเพิ่ม

$app->setBasePath('/myslim');   

อีกวิธีที่วุ่นวายกว่านิดหน่อยคือ คัดลอก index.php และ .htaccess  ใน public ออกมาไว้ ../public

  • จากนั้นแก้ไขไฟล์ index.php คือแก้ไอ้พวกพาธ /../file ให้เป็นประมาณนี้ /file เช่น

// require __DIR__ . '/../vendor/autoload.php';

require __DIR__ . '/vendor/autoload.php';

  • จากนั้นให้แก้ไขไฟล์ เพิ่ม $app->setBasePath('/myslim');  ใน index.php ไฟล์ที่แก้ไปเมื่อกี้แหละ หรือจะไปแก้ที่ app/routes.php ก็ได้เช่นกัน

Ref

  • https://akrabat.com/running-slim-4-in-a-subdirectory/

Friday, October 8, 2021

เริ่มต้นกับ Slim Framework 4 : การติดตั้งบน Ubuntu 20.04

  • Slim framework คือ RESTFul php framework ตัวหนึ่ง ที่ลองหัดติดตั้งและใช้งานครั้งแรก
  • เอาไว้เขียน RESTFul service ไว้ใช้งานเอง
  • Slim 4 ใช้ php 7.2++ นะคับ

Env

  • Slim 4
  • Ubuntu 20.04 + LAMP
  • apache enabled mod_rewrite
  • PHP 7.4.x
  • path doc root => /var/www/html
  • domain =>  www.mysite.com

การติดตั้งทำได้หลายวิธี แต่จะนำเสนอแค่ 2 วิธี

Method 1  downlaod zip file แตกไฟล์ใช้เลย

  • https://github.com/slimphp/Slim-Skeleton



  • จากภาพดาวน์โหลดมาจะได้ไฟล์ Slim...zip ในนั้นจะมี 1 folder
  • ให้แตกไฟล์ โดยเอา folder Slim-Skeleton-master ไปวางไว้ www root path
  • แล้วเปลี่ยนชื่อ folder ให้เป็นตามที่เราต้องการ เช่น myslim
  • เราจะได้ พาธอยู่ประมาณนี้ /var/www/html/myslim

Method 2 ด้วย composer

  • ในกรณีไม่มี composer ในระบบให้เราติดตั้งด้วยคำสั่งแบบนี้

$ curl -sS https://getcomposer.org/installer | php

$ mv composer.phar /usr/local/bin/composer

$ chmod +x /usr/local/bin/composer

  • หรือ สั้นๆ ง่ายๆ ก็ apt install ซะ

$ sudo apt install composer

  • จากนั้นติดตั้ง Slim ด้วยคำสั่งประมาณนี้

composer create-project slim/slim-skeleton [my-app-name]

  • ตัวอย่างเช่น

$ cd /var/www/html

$ composer create-project slim/slim-skeleton myslim

  • เราจะได้ folder ตามนี้ /var/www/html/myslim

ทดสอบระบบติดตั้งเรียบร้อย

  • โดยเข้าไปที่ www.mysite.com/myslim จะได้ผลประมาณนี้ 


  • หรือต้องเข้าไป public แบบนี้หว่า www.mysite.com/myslim/public จะได้ประมาณนี้
  • แก้ไขเวลาเข้า public ให้แสดงผลได้ก่อนแล้วกัน โดย $app->setBasePath('/[myapp/public]');
  • ในไฟล์ public/index.php หรือ app/routes.php
  • ใน public/index.php เพิ่ม $app->setBasePath('/myslim/public'); ประมาณบรรทัด 39
  • หรือใน app/routes.php เพิ่ม $app->setBasePath('/myslim/public'); ประมาณบรรทัด 12

  • เพิ่มที่ไฟล์ใด ไฟล์หนึ่งก็พอนะ
  • ที่นี้ลองเข้า www.mysite.com/myslim/public
  • ขึ้นแบบนี้แสดงว่าใช้งานได้แล้ว ให้เพิ่ม method get post put ใน app/routes.php ได้เลย
  • แต่ตอนเรียกใช้งานต้องเรียผ่าน myapp/public นี่แหละ ไม่ค่อยเข้าท่าเลย
  • ซึ่งเราแก้ไขโดยเพิ่ม .htaccess ภายใต้ myapp ของเราในที่นี้คือ myslim/.htaccess และเพิ่มคอนฟิกแบบนี้ในไฟล์นี้
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
  • จากนั้นแก้ไข $app->setBasePath('/myslim/public'); แก้เป็น $app->setBasePath('/myslim');
  • เรียกใช้งานโดย www.mysite.com/myslim/ อันนี้เค้าเรียก ทำเป็น subdirectory
Ref

  • https://app.wftutorials.com/Getting-started-with-the-PHP-Slim-framework-version-4
  • https://www.slimframework.com/docs/v4/start/web-servers.html

Popular Posts