20201125のPHPに関する記事は13件です。

Windows10にPHP8をインストールする

PHP8をWindows10に手動インストールします。64bit版

Visual C++ 2015-2019 再頒布可能パッケージのインストール

PHP8を動かすには、Visual C++ 2015-2019 再頒布可能パッケージ のインストールが必要です。
事前にインストールしてください。

直リンク:https://aka.ms/vs/16/release/vc_redist.x64.exe
公式ヘルプ:https://support.microsoft.com/ja-jp/help/2977003/

PHP8 のダウンロード

PHP公式サイトから、PHP8 (x64,スレッドセーフ) のzipファイルをダウンロードする。

https://windows.php.net/download/

解凍したら、今回はC:/phpに配置するとします。

環境変数の設定

PHPのパスを、環境変数のPathに追加する作業です。

スタートボタンを右クリック → 検索
検索ボックスに環境変数と入力して、「環境変数を編集」を開きます。

名称未定-12.png
ユーザ環境変数にあるPathを選択して編集ボタン

名称未定-1.png
PHPのパスであるC:/phpを新規に加えてください

php.ini の設定

PHPの設定ファイルを編集します。

PHPフォルダにあるphp.ini-developmentを複製し、php.iniと名前を変更します。

そしたらphp.iniを開いて編集します。
設定については詳しく説明できませんが、代表的な設定例を紹介しておきます。
行頭の;を削除すると設定が有効になります。

;タイムゾーン
date.timezone = "Asia/Tokyo"

;エクステンションフォルダをフルパスで
extension_dir = "C:/php/ext"

;必要に応じて各種エクステンションを読み込む
extension=mbstring
extension=gd

動作確認

PHPが正常に動作するか、コマンドラインから確認する作業です。

スタートボタンを右クリック → PowerShell を起動。
コマンドにphp -vと入力して、正常に表示されればOKです。

名称未定-3.png

Apache の設定

PHPをApacheに組み込む設定を行います。

Apacheのconf/httpd.confを開いて、ファイルの最後に次の3行を加えてください

LoadModule php_module "C:/php/php8apache2_4.dll"
PHPIniDir "C:/php/"
AddHandler application/x-httpd-php .php

これでApacheを再起動すれば、PHPが読み込まれます。
phpinfo();などで動作確認してみよう。

エクステンションが読み込めない場合

ApacheからPHPのエクステンションが読み込めない場合は、次のことを試してください。

  • php.iniのextension_dirがフルパスになっているか確認する
  • curlを利用する場合はphp/libssh2.dllapache/binにコピーする
  • sqlite3を利用する場合はphp/libsqlite3.dllapache/binにコピーする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP8をWindows10にインストールする

PHP8をWindows10にインストールします。64bit版

Visual C++ 2015-2019 再頒布可能パッケージのインストール

PHP8を動かすには、Visual C++ 2015-2019 再頒布可能パッケージ のインストールが必要です。
事前にインストールしてください。

直リンク:https://aka.ms/vs/16/release/vc_redist.x64.exe
公式ヘルプ:https://support.microsoft.com/ja-jp/help/2977003/

PHP8 のダウンロード

PHP公式サイトから、PHP8 をダウンロードする。

https://windows.php.net/download/

いろいろありますが「VS16 x64 Thread Safe」のzipファイルを選択します。
解凍したら、今回はC:/phpに配置するとします。

php.ini の設定

PHPの設定ファイルを編集します。

PHPフォルダにあるphp.ini-developmentを複製し、php.iniと名前を変更します。

そしたらphp.iniを開いて編集します。
設定については詳しく説明しませんが、代表的な設定例を紹介しておきます。
行頭の;を削除すると設定が有効になります。

;タイムゾーン
date.timezone = "Asia/Tokyo"

;エクステンションフォルダをフルパスで
extension_dir = "C:/php/ext"

;必要に応じて各種エクステンションを読み込む
extension=mbstring
extension=gd

環境変数の設定

環境変数のPathにPHPのパスを追加する作業です。

スタートボタンを右クリック → 検索
検索ボックスに環境変数と入力して、「環境変数を編集」を開きます。

名称未定-12.png
ユーザ環境変数にあるPathを編集する

名称未定-1.png
PHPのパスであるC:/phpを新規に加えてください

動作確認

PHPが正常に動作するか、コマンドラインから確認する作業です。

スタートボタンを右クリック → PowerShell を起動。
コマンドにphp -vと入力して、次のように表示されればOKです。

名称未定-3.png

Apache の設定

PHPをApacheに組み込む設定を行います。

Apacheのconf/httpd.confを開いて、ファイルの最後に次の3行を加えてください

LoadModule php_module "C:/php/php8apache2_4.dll"
PHPIniDir "C:/php/"
AddHandler application/x-httpd-php .php

これでApacheを再起動すれば、PHPが読み込まれます。
phpinfo();などで動作確認してみよう。

エクステンションが読み込めない場合

ApacheからPHPのエクステンションが読み込めない場合は、次のことを試してください。

  • php.iniのextension_dirがフルパスになっているか確認する
  • curlを利用する場合はphp/libssh2.dllapache/binにコピーする
  • sqlite3を利用する場合はphp/libsqlite3.dllapache/binにコピーする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu Nginxでwordpressの環境構築

wordpress環境構築の為に、AzureでVM作成してサーバーを立てました。

サーバのOSはUbuntu 18.04.5 LTSです。

レンタルサーバーなどを使用すれば簡単にできるwordpress環境構築ですが、1からwordpressの環境を構築したら結構難しかったので、やり方をまとめました。

UbuntuにwebサーバーNginxをインストール

ApacheかNginxかで迷いましたが今回はNginxを使用しました。

まずは、インストール可能なパッケージの「一覧」を更新し、nginxをインストールする下記コマンドを実施。

ちなみに、apt-getコマンドは、Debian系のディストリビューション(DebianやUbuntu)のパッケージ管理システムであるAPT(Advanced Package Tool)ライブラリを利用してパッケージを操作・管理するコマンドです。

centOSの場合は、apt-getの代わりにyumコマンドが使えます。

# apt-get update
# apt-get install nginx

Nginxがインストールできたら、Nginxの設定が書いてある、nginx.confファイルを編集します。

vim /etc/nginx/nginx.conf

client_max_body_sizeを追加し、最大アップロードサイズを32めがバイトに設定します。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
client_max_body_size 32M;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

Nginxを再起動します。
Nginxの設定ファイルなどを編集した際は、必ず再起動するようにして下さい。

# sudo service nginx restart
# sudo service nginx status

再起動後はステータスを確認し、activeになっていればOK。

● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-12-29 04:29:22 UTC; 1h 17min ago
Docs: man:nginx(8)
Process: 2233 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status
Process: 2221 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exite
Main PID: 2238 (nginx)
Tasks: 2 (limit: 1152)
CGroup: /system.slice/nginx.service
├─2238 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─2239 nginx: worker process

UbuntuにMySQLをインストールする

wordpressではデータベースMySQLを使用する為インストールする。

# apt-get update
# apt-get install mysql-server mysql-client

インストールしたら実際にデータベースを作成する必要があります。

下記のコマンドでMySQLにアクセスします。

# sudo mysql -u root -p

・今回の場合、wordpressという名前のデータベースを作成
・今回の場合、ユーザー名takeshi123パスワードsample123という名前のMySQLユーザーアカウントを作成します。

mysql> CREATE DATABASE wordpress CHARACTER SET UTF8 COLLATE UTF8_BIN;
CREATE USER 'takeshi123'@'%' IDENTIFIED BY 'sample123';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;
quit;

NginxにPHPサポートを追加する

wordpressはPHPを使用します。

NginxでPHPを使用できるようにPHPサポートを追加する為に、PHPの必須パッケージをインストールし、必要なPHPモジュールをインストールする。

# apt-get update
# apt-get install php7.2-fpm
# apt-get install php7.2-xml php7.2-curl php7.2-gd php7.2-mbstring php7.2-readline
# apt-get install php7.2-bz2 php7.2-zip php7.2-json php7.2-opcache

インストールが完了したら、PHP設定ファイルのphp.iniを編集します。

# updatedb
# vi /etc/php/7.2/fpm/php.ini
php.ini
file_uploads = On
max_execution_time = 300
memory_limit = 256M
post_max_size = 32M
max_input_time = 60
max_input_vars = 4440
upload_max_filesize = 32M

次に、NginxのデフォルトWebサイト設定ファイルを下記のように書き換える。

# vim /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
}

PHPサービスを再起動し、Nginxも再起動する。

# sudo service php7.2-fpm restart
# sudo service nginx restart

UbuntuにWordpressをインストールする

tmpフォルダにwordpressをインストールする。

webブラウザでwordpress公式サイトにアクセスしてローカル環境にダウンロードしても良い。

その際サーバーにアップロードする場合は、scpコマンドでサーバーにアップロードすれば良い。

今回はサーバー上でコマンド操作でインストールしました。

# cd /tmp
# wget https://wordpress.org/latest.tar.gz
# tar -zxvf latest.tar.gz

インストールしてファイルを解凍したら/var/www/html/に移動

# mv wordpress /var/www/html/
# chown www-data.www-data /var/www/html/wordpress/* -R

WordPressのデータベースの接続情報などが記載してある設定ファイルであるwp-config.phpを編集します。

# cd /var/www/html/wordpress/
# mv wp-config-sample.php wp-config.php
# vim wp-config.php
wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'takeshi123');
define('DB_PASSWORD', 'sample123');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

これで設定は完了です。

ブラウザにアクセスすればWordpress画面にアクセスすることができるはずです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでの基本的なこと (2)

備忘録代わりにまとめる
毎回文末の;を忘れそうになる

if文

if

if文は if(条件式){真だった場合}と表記する

$code = "Qiita";

if ($code == "Qiita"){
    echo "$code は \"Qiita\"";
}
// Qiita は "Qiita"

else

elseを含んだif文は if(条件式){真だった場合}else{偽だった場合}と表記する

$code = "Ooita";

if ($code == "Qiita"){
    echo "$code は \"Qiita\"";
}else{
    echo "$code\"Qiita\" ではない";
}
// Ooita は "Qiita" ではない

else if

else ifを含んだif文はif(条件式1){条件1が真だった場合}else if(条件式2){条件式2が真だった場合}else{すべて偽だった場合}と表記する

$code = "Ooita";

if ($code == "Qiita"){
    echo "$code は \"Qiita\"";
}else if {
    echo "$code は \"Ooita\"";
}else{
    echo "$code\"Qiita\" でも \"Ooita\" ではない";
}
// Ooita は "Ooita"

ループ

while

whileはwhile(条件式){実行}と表記する

$code = 1
while ($code < 10){
    echo $code++."回目のループ";
}
// 1回目のループ2回目のループ3回目のループ……9回目のループ

改行はしないことに注意
改行を含めて行いたい場合は\nをつけること

for

for文はfor(変数とその初期値の宣言;繰り返しの条件;一回行う事の処理){処理}と表記する

for( $i = 0; $i < 10; $i+=2 ) {
echo "$i\n";
}
/*
0
2
4
6
8
*/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベース接続

データベース接続

try{
  $pdo=new PDO('mysql:dbname=mydb;host=localhost;charset=utf8','root','root',
[
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //連想配列
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //例外
  PDO::ATTR_EMULATE_PREPARES => false, //SQLインジェクション対策
])
}
catch(PDOException $e){
  $e->getmessage();
}

トランザクション処理

SQLをまとまりで実行する仕組み。
SQLの実行途中にエラーなどが起きたら、rollbackで処理を中断して巻き戻す。

例)銀行のシステムで出金入金をする際に出金は正常に処理できたが、
入金は処理出来なかったという事態を防ぐ。

$pdo->beginTransaction();

try
{
  //SQL処理

  $pdo->comit();
}

catch(PDOException &e)
{
  $pdo->rollback()
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GoToイート加盟店舗を地図上で選べるサービス作った

こんなもの

・「食べログ」「ぐるなび」「ホットペッパー」を統括してGoToイートの店舗を確認できるブラウザアプリ
・ 地図ベースで手軽と検索できる(個人店舗を応援するためのもので、有名チェーン店は除外)
・ 煩雑なインストールなし(PWAは対応)、ユーザ登録なし
幹事マップはこちら

コンテンツ

スマホでの表示画面
Image from iOS.png

マーカクリックで店舗情報が表示されます。
Image from iOS (3).png

ぐるなびで検索した場合で、検索に駅名を入力するとそこへ飛べます。
Image from iOS (2).png

ホットペッパーで検索した場合
Image from iOS (5).png

利用技術一覧

・javascript
・OpenStreetMap + Leaflet
・jquery
・MySQL
・PWA
・PHP(軽量化のためフルスクラッチ)
・GPS

特徴

・ズームレベルで周辺店舗を統括して見やすさ向上
・非同期通信によるUX向上
・逐次通信によるデータ転送量の削減
・タイルサーバは自前
・PWA化対応

気になること

・トラフィックが増えたときの挙動
・デザインが受け入れられるのかどうか
・GoToイート終わりそうw

最後に

もしよかったら触ってみてフィードバックを頂ければ大変嬉しく思います。どうぞよろしくお願いいたします。
https://kanjimap.jp

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

異なるVPNプロトコル間の比較:OpenVPN、L2TP / IPSec、SSTP、IKEv2、PPTP

次のVPNプロトコルが発生する可能性があります。

-OpenVPN:常にOpenVPN。オープン仮想プライベートネットワークと呼ばれることはありません。
-L2TP / IPSec:レイヤー2トンネリングプロトコルとインターネットプロトコルセキュリティの組み合わせ。
-SSTP:セキュアソケットトンネリングプロトコル。
-IKEv2:MicrosoftとCiscoによって開発されたネットワークキー交換バージョン2。
-PPTP:ポイントツーポイントトンネリングプロトコル。

これが紛らわしい、あるいは気が遠くなるようなように思われる場合でも、悲しんではいけません。これらのことを知っている人はほとんどいませんし、技術に精通した人もたくさんいます。

すでに途方に暮れていて、あなたに最適なVPNを選択するのに助けが必要ですか? VPNを使用して、手順を簡素化し、選択プロセスを簡素化してください。私たちはあなたのためにそれを研究しました。

そうは言っても、VPNプロトコルについて知っておく必要のあるほとんどすべてがここにあります。

VPNプロトコル

合意がルールです。人々は規則に従うだけでなく、コンピューター、ネットワーク、VPNソフトウェアも規則に従います。これらはこのようにプログラムされています。

データとプライバシーの保護からIPアドレスの変更まで、VPNには同じ効果があります。ただし、VPNは、使用するデバイスのタイプ、実行する内容、または実行する内容に応じて、異なるプロトコルを使用します。

ただし、ほとんどのVPNレビューサイトは、これらのVPNプロトコルに関する次の事実を知りません。

上記のプロトコルは異なるテクノロジーです。

さまざまなデバイスに適用可能なプロトコル

セキュリティソフトウェア会社(VPNプロバイダーなど)は、VPNプロトコルを含む当社のテクノロジーの改善に懸命に取り組んできました。契約が変更されます。

さらに、電話とタブレットにはさまざまなVPNプロトコルがあり、特定のタスクを実行したり、以前よりも優れたパフォーマンスを発揮したりできます。

そのため、心配する必要はなく、考える必要もありません。

VPNプロトコルはあなたに何を提供できますか?

VPNはあなたのためにセキュリティとプライバシーを念頭に置いています、彼らはそれが私たちが望んでいるものであることを知っています。

したがって、選択したVPN(信頼できるVPNの場合)がネットワークと保護に最適なVPNプロトコルを提供するのでご安心ください。

他の点では、プライバシー、セキュリティ、および他の制限されたWebサイトへのアクセスを支援するという点で正しいプロトコルを使用します。

ただし、VPNプロバイダー(NordVPN、専用インターネットアクセスVPN、Cyber​​ Ghost VPNなど)のWebサイトにアクセスすると、すべてのプロバイダーに通知されます。あなたは彼らがサポートするVPNプロトコルです-あなたが必要とするのと同じように、そこに入力してオプションをテストしたいと思います。

OpenVPN-今日のトッププロトコル

セキュリティ技術の観点から、OpenVPNはトップVPNプロトコルと見なされています。ほとんどすべてのVPNレビューサイトと専門家が教えてくれます。

ほとんどすべてのVPNは、特にコンピューターの場合、デフォルトのVPNプロトコルとしてOpenVPNを使用します。

アプリケーションで使用されているプロトコルを変更することはできませんが、これはほとんどのユーザーにとって問題ありません。 Android、macOS、およびWindows用のOpenVPNプロトコルを使用して、接続を保護します。これは、より新しく、より速く、より安全でオープンソースであるため、私の好みのプロトコルです。

主要なVPNにサインアップする

したがって、VPNの使用を検討するときは、プロトコル部分を怖がらせないでください。これらの点を覚えておいてください。

VPNはあなたをサポートします。彼らはデフォルトであなたのデバイスに最適なVPNと最適なプロトコルを使用するかもしれません。
協定を勉強する必要はありません。 VPNを使用するときに特定の種類のタスクを処理する必要がない限り、オンラインにすることができます。
OpenVPNは、コンピューターの主要なプロトコルです。これはVPNプロバイダーによって選択されたプロトコルですが、一部のモバイルデバイスでは、オプションではありません。

日本に適したVPNを選択すれば、すべてがうまくいくことを忘れないでください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

セッション時間を延ばす

PHPセッション時間を延長する

PHP.iniのsession.gc_maxlifetimeを延ばす

session.gc_maxlifetime = 1440

参考

[php]ログインセッションの維持・有効期間について (session,cookie)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでの基本的なこと (1)

最初に

普段Pythonをつかっているため、そこと完全に一致しているものは省略しているかも

メモ

プログラムの最後には;をつけること

コメントアウト

1行のコメントアウト

// これでコメントアウトされる

複数行のコメントアウト

/*
echo "/*と* /で挟むと";
echo "その間の行は";
echo "実行されない";
echo "上のやつで空白が入っているのはコメントアウト解除を防ぐため"
*/

標準出力

文字列

文字列の場合は""で挟む

echo "ABC";
// 出力 ABC

数字

数字の場合はそのままでおk
特に形式などを指定する必要もなさそう

echo 15;
// 出力 15
echo 10.5;
// 出力 10.5

論理型

論理型の場合はechoでtrueを出力すると1、falseは何も出力されない

echo true;
// 1
echo false;
// 出力されない

複数行出力

\nをつけるとその位置で改行

echo "ABC\nDEF";
/*
ABC
DEF
*/

エスケープシーケンス

""を入れたい場合は\"をつける

echo "\"Hello\"";
// "Hello"

変数

頭に$をつけることで変数であると宣言できる

演算

//和
$number1 = 4 + 8;
echo $number1;
// 12

//差
$number2 = 9 - 5;
echo $number2;
// 4

//積
$number3 = 6 * 5;
echo $number3;
// 30

//商
$number4 = 6 / 3;
echo $number4;
// 2

//余り
$number5 = 7 % 4;
echo $number5;
// 3

もちろん複合演算子(+=など)も使用可能

なお、以下のように直接演算をして出力することも可能

echo 3 + 8;
// 11

定数

代入などによって変化することのない値

define("Pi", "3.14");
echo Pi;
// 3.14

連結

.でつなぐことで連結して出力することができる

echo "ABC"."DEF";
// ABCDEF

文字列と変数・定数の連結

.でつなぐことで変数や定数も接続することができる

$number = 12345;
echo "number".$number;
// number12345

配列

まとめる要素をarray(と)で挟む

array("要素1","要素2","要素3");

連想配列

配列同様にarray(と)で挟む
さらに=>で2つの要素をつなぐ

array("商品名"=>"コーラ", "種類"=>"飲料");
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP で最後の終了タグがあると何が起きるか

PHP はテンプレート言語ですので、コードは PHP タグで囲みますが、ファイル末尾の終了タグは省略することが推奨されています。

<?php
if(...) {
}
...
?> // ←省略を推奨

PSR-2 には

The closing ?> tag MUST be omitted from files containing only PHP.

とありますし、PHP マニュアルの PHP タグ にも

ファイルが PHP コードのみを含む場合は、ファイルの最後の終了タグは省略するのがおすすめです。 終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるからです。 余分な空白や改行のせいで PHP が出力バッファリングを開始し、その時点の内容を意図せず出力してしまうことになります。

とあります。では実際に終了タグを省略しない場合には何が起きるのでしょうか。

前提知識

PHP タグの外側の扱い

PHP はテンプレート言語ですので、PHP タグの外側は print 文が書かれているのと同等の扱いになります。

hoge
<?php
print "fuga\n";

<?php
print "hoge\n";
print "fuga\n";

と同等です。終了タグのあとでも、空行であっても print と等価になります。

<?php
print "hoge\n";
?>
  // ←空行を入れた

<?php
print "hoge\n";
print "\n";

と解釈されるというわけです。

レスポンスヘッダの自動送信

PHP は print 文を処理した際に HTTP レスポンスヘッダが未送信の場合、HTTP ステータス 200 と Content-Type: text/html; charset=UTF-8 ヘッダが送信されます。

<?php
print "hoge\n";

header("HTTP/1.1 200 OK");
header("Content-Type: text/html; charset=UTF-8");
print "hoge\n";

と同等です。

実験環境

Apache 2.4.46 + PHP 7.4.11 という環境で実験を行いました。

不具合例 : header 関数が誤動作する

test.php
<?php
require('lib.php');
header("Location: https://qiita.com");
?>
lib.php
<?php
?>
  // ←ここに空行

test.php にアクセスすると qiita.com にリダイレクトするはずですが、実際にアクセスすると

image.png

Warning: Cannot modify header information - headers already sent by (output started at /usr/local/www/apache24/data/lib.php:3) in /usr/local/www/apache24/data/test.php on line 3 というエラーが発生してしまいました。

telnet コマンドでも確認してみます。

$ (echo "GET /test.php HTTP/1.0"; echo ""; sleep 1) | telnet 192.168.1.253 80
Trying 192.168.1.253...
Connected to 192.168.1.253.
Escape character is '^]'.
HTTP/1.1 200 OK
Date: Fri, 13 Nov 2020 05:27:08 GMT
Server: Apache/2.4.46 (FreeBSD) PHP/7.4.11
X-Powered-By: PHP/7.4.11
Content-Length: 214
Connection: close
Content-Type: text/html; charset=UTF-8


<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /usr/local/www/apache24/data/lib.php:3) in <b>/usr/local/www/apache24/data/test.php</b> on line <b>3</b><br />
Connection closed by foreign host.

HTTP ステータス 302 を返して欲しいところですが、200 が返ってきています。具体的には以下のようなことが起こっています。

  1. test.php から lib.php が読み込まれる。
  2. lib.php の末尾の終了タグ後に空行があることから print 文処理が行われる。
  3. print 文を処理するにあたり、レスポンスヘッダが未送信であることから HTTP ステータス 200 と Content-Type: text/html; charset=UTF-8 が送信される。
  4. test.php で header 関数を処理するが、既にレスポンスヘッダが送信済であるため無効となり、警告が出力される。

Location 以外にも、HTTP ステータス 4xx や 5xx を返せませんし、Content-Type として image/jpeg や application/pdf などを返したくても返せません。

warning 出力を抑制し(本番環境では大抵そうでしょう)、HTTP クライアントが HTTP ステータスや Content-Type を無視して実データからある程度いい感じに処理してくれたりすると、テストでも発覚しなかったりしますので余計にやっかいです。

不具合例 : HTML の解釈が変わる

HTTP ステータス 200 と text/html を返す場合は、先に header() が実行されていても問題はありません。そして HTML は基本的に改行を無視する言語ですので空行が余計に入ったところで問題は無いのですが、場合によっては HTML の解釈が変わることがあります。

DOCTYPE が無視される

ブラウザによっては DOCTYPE 宣言が1行目にないと無視されます。その場合 DOCTYPE 宣言が省略されたものとみなされデフォルトの文書タイプが適用され、レンダリングが大幅に崩れてしまうことがあります。

ということが古い Internet Explorer ではよくあったのですが、ほとんどのブラウザがデフォルトで HTML5 でレンダリングするようになった現代ではあまり問題になることはないでしょう。

textarea や pre で余計な改行が入る

HTML ではほとんどの場合改行を含むホワイトスペースは意味を持ちませんが、textarea や pre 要素の中では別です。新規のフォームを開いたのにテキストエリアに謎の改行が入っているということがたまにありますが、犯人はこいつの可能性があります。

謎の空白が入る

HTML ではホワイトスペースは意味を持たないのですが、全くレンダリングされないわけでもありません。多くのブラウザでは連続するホワイトスペースは一つにまとめて、一つだけホワイトスペースがレンダリングされます。結果として意図せぬ空白が入って表示がちょっとだけずれるということが起こります。

まとめ

実際のところ、終了タグを省略しなくてもそれだけでは問題は発生しません。問題となるのは、終了タグのあとに空行を入れてしまった場合です。

大抵のプログラム言語のソースコードでは空行は意味を持ちませんので、ファイルの末尾に空行を入れても何の問題も起きません。PHP でもコード部分であれば空行は無視されますが、テンプレート部分の場合は print 文と等価になってしまうわけです。

終了タグを書いてもそのあとに空行は絶対に入れないことを守れるのなら終了タグを書いてもいいのですが、実際には守れないこともあるだろうから、それならば終了タグをそもそも書かないようにした方がいいのではないかというのが PSR-2 などの主張ということになります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on railsとLalavelどっちが良い?

技術選定の仕方

・自分のやりたい事が実現しやすい
・情報量が多い

プログラミングはあくまでも手段でしかなく、プロダクトの価値を最大化させることこそが目的である。またプログラミング言語は、基礎文法は少し変わるぐらいで大した差はない。言語に縛られるよりも、自分が言語に合わせて勉強していくほうが、プロダクトの価値も開発効率も上がる。

Ruby on railsを選びました

①scaffoldが便利
MVCの作成はrouteの設定までいい感じに自動で生成してくれる。

②情報量が多い!
ruby自体が日本発の言語ということもあり、qiitaの記事の数をはじめ日本語の説明の記事がlalavelよりも多い。

③コミュニティー内に参考にできるソースコードがある
身近にコードについて質問でき参考にできるコードがあるのは、めっちゃ楽。

Rails: ある程度の規模まではレールに乗ってサクサク作れるが、アプリケーションが成熟してきて「規約」にはないことをやりたくなってくると、途端に求められる技術力や難易度が跳ね上がる。
Laravel: アプリケーションの雛形はあるものの、どのクラスに何を担わせるかなど、設計については Rails 以上に早い段階で意識する必要がある。その設計さえイケていれば、だいたいのことはしっかり書ける。
Rails 歴5年の僕が Laravel で開発するようになって思ったこと。
https://note.com/kurashicom_tech/n/n32ab25910783

結論

僕のような初学者には、railsをおすすめします。railsのレールに乗りながら、まずはMVCの基礎を自分にインプットしていく。その後、lalalvelに挑戦!で良いかなと思う。
どちらの言語も実行コマンドは似ているし、Railsはgem、Laravelはcomposerを使えば各種プラグインも簡単に導入できるので、あまり差はないと感じます。
最後まで読んでいただきありがとうございます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】url生成(idなど使用)したページで、現在のページをリロードする方法

はじめに

フォロー・フォロー解除の機能を実装するときにはまった。
フォローボタンクリック → 同ページをそのままリロード
という動きを実現させたい。
方法が思いつかなくて手間取ったので記事にします。

通常のリロード方法

通常のページであればそのままurlを指定してリロードすればOK。

return redirect('/home');

ただし、今回リロードしたかったページが以下のようにidを使用したurlだったため、
urlに何をいればば良いかわからなくて困った。
/users/[id]

解決方法

以下のようにurl([url])を使用して変数を入れることで解決した
(そんなに難しいことでもなかった。。)

return redirect(url('/users',$request->follow_id));

まとめ

ページを普通にリロードする関数などあると思っていたが、どうやらないっぽい。
なんだか同じurlを打ち込んでリダイレクト、というのは力技感があって好きではないので、もしスマートなやり方があったらコメントで教えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

簡単! MAMPでgensim、word2vecを使う。

注意! python、mamp、gensimがインストールされた環境の方にむけたものです。できてない方はインストールしてください。
あと、word2vecの学習ではなく、似ている言葉探すだけです。

まず、phpからpythonに接続します。

phpにこれを入れてください〜!
execというコードは、phpからコマンドラインにアクセスできます。(macのターミナルと同じやつ。)

<?php
exec('ls')
?>

これを使って、word2vecが書かれたpythonを実行します。
例えば...、test.pyのようなpythonファイルをphpから実行できます。

<?php
exec('python test.py')
?>

次にword2vecで似ている言葉を探すためにデータを持ってきます。
zipダウンロードしましょう。
http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/
これを後で使います。

次にpython側ですが、新しいpythonファイルを作ってください。このように書きます。
これでok〜!
さっきダウンロードしたzipを回答して近くに置いてください。それが「entity_vector/entity_vector.model.bin」です。
(今、日本語でコメントアウトで書いてある部分を消さないと読み込むときエラーが出るので消してください!(多分工夫したら読み取れる。なんかあると思う。))

以下のようにsys.pathでパスを通してあげないと..
「ImportError: No module named 'gensim' 」というエラーが出ます。これはmampの中に設定されてるモジュールを探す場所が違うということです。なのですでにmacの中にインストールされたgensimのパスをターミナルで探しましょう。(pip show gensim)

word2vec.py
# macのターミナルで、pythonでgensim modelsをインポートすることはできるんですが、mamp上にはパスが入ってません。
# なので、sys.pathでパスを入れてあげます。
import sys
sys.path.append('パス')
# 上の「パス」の部分には、次に調べる絶対パスを入力してください。(例:/Users/太郎/anaconda3/lib/python3.6/site-packages)

# 以下word2vecを実行するコード。
# 「graphic」と似ている言葉を探します。
from gensim.models import KeyedVectors
model_dir = 'entity_vector/entity_vector.model.bin'
model = KeyedVectors.load_word2vec_format(model_dir, binary=True)

results = model.similar_by_vector("graphic", topn=10, restrict_vocab=None)

for result in results:
    print(result)

では、phpに戻ります。
先ほどのexec()で、コマンドを実行し、pythonファイルを実行します。
第2引数には、結果が。第3引数には、エラーがあれば何かそれが返ってきます。
これで..結果は..

index.php
$command = 'python wd2vc.py';
exec($command, $output, $return_var);
var_dump($output, $return_var);

いけた〜〜!!
「graphic」と似ている言葉が配列で出力されてます。やったね!

image.png

参考記事:
PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる
https://qiita.com/smd8122/items/65b552f1d53bfb7fad9a
MAMPのPHPからMecabを使おうとしたら少しハマった話!
https://dbym4820.hatenablog.com/entry/2017/10/18/171259

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む