まとメモ

29才でエンジニアに転職したエンジニアのメモ

html内のphpを動かそうとしたらダウンロードされてしまう

htmlに記述したphpを動かしたかったが、調べた方法だとファイルがダウンロードされて困った。

現象

  • htmlファイルにPHPを記述し動かそうとしたら、アクセスするとファイルがダウンロードされてしまう

解決方法

$ vi /etc/php-fpm.d/www.conf

#コメントアウト外して .html を追加
security.limit_extensions = .php .php3 .php4 .php5 .php7 .html

$ vi /etc/httpd/conf.d/php.conf 

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    #html追記
    <FilesMatch \.(php|phar|html)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>

  </IfModule>
</IfModule>

やったこと(以下は全部だめでした)

/etc/httpd/conf/httpd.conf

//これとか
<IfModule mime_module>
   AddType application/x-httpd-php .html
</IfModule>

// これとか
AddType application/x-httpd-php .php .html

// これとか
AddHandler application/x-httpd-php .php .html

めちゃめちゃ調べてもダメなパターンしか見つからず、はまった、、、

php.iniが反映されない

php.iniの設定を変更して、sudo systemctl restart httpdApacheを再起動しても変更が反映されなかったのでメモ。

systemctl restart php-fpm


  1. php.iniの場所

    /etc/php.ini

  2. 適宜ファイルの内容を変更

  3. 変更を反映させる

    systemctl restart php-fpm

です。

補足

  • phpinfo()でServer APIを確認
    • FPM/FastCGIとなっていたらPHP-FPMを介してPHPを実行している。

f:id:aki_photo_blog:20210311231403p:plain
phpinfo()

ちなみに

sudo systemctl start php-fpm
Failed to start php-fpm.service: Unit not found.

こんなんになったらシステムの設定ファイルが置いている場所を確認

ls /etc/systemd/system/
...
drwxr-xr-x 2 root root 6 1月 1 23:59 php70-php-fpm.service.d
...

上記の場合はこれでok

sudo systemctl start php70-php-fpm

以上です。

【Apache】バーチャル ホストとは?

自称webエンジニアだが、最近インフラを触る事が多い。 もちろんインフラに関しては素人なので、基本的なことをメモする。

バーチャルホスト(Virtual Host)とは1つのサーバで複数のドメインを運用する技術のことで、Webサーバ、メールサーバなどで利用される。
バーチャルホスト - Wikipedia

最初はなんのこっちゃだったので、自分なりに噛み砕いてみる。

1つのサーバで複数のドメインを運用する

キーワードはドメインですね。

ドメインとは、数字とドットで表されるIPアドレスを、人間が理解しやすい文字に置き換えた名前の事。だと思っている。 (詳しくは各自ググってください!)

で、そのドメインを複数使用する場合がある、と。

たとえばこんな時。

  • foo.com
  • music.foo.com
  • book.foo.com

こんな感じの3つのドメインを使って、別のサービスを運用したいとする。 (しれっとサブドメインを登場させたが、?な方は各自ググってくださいー)

この時に3台サーバーを使用し、1台1ドメインとすれば何も問題がないのだが、お金がかかるので1台でなんとかならないか。。。

という時に使うのがバーチャル ホストである!

少し具体的に書くと、/etc/httpd/conf.d/フォルダの下に、vhost-foo.conf という名前で設定ファイルを作り、以下のように記述する。

<VirtualHost *:80>
  ServerName foo.com
  DocumentRoot /var/www/sites/foo.com
</VirtualHost>

<VirtualHost *:80>
  ServerName music.foo.com
  DocumentRoot /var/www/sites/music.foo.com
</VirtualHost>

<VirtualHost *:80>
  ServerName book.foo.com
  DocumentRoot /var/www/sites/book.foo.com
</VirtualHost>

こうすることにより、ドメイン毎にDocumentRootが異なり1台のサーバーでも複数のドメインを運用することができる。

Laravel で DB接続エラー

上記教材でLaravel学習2日目。

マイグレーションができずに小一時間ハマった。。。

In Connection.php line 664: SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES) (SQL: select * from information_schema.ta
bles where table_schema = homestead and table_name = migrations) In Connector.php line 67: SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES)

先に解決方法を言います。

Homestead内でssh接続して、プロジェクトに移動しmigrateを実行する!

そうです。

ずっと

ローカルのプロジェクトディレクトリでコマンド叩いてた。。。

これに気づかず.envとdatabase.phpをいじり倒した。。。

参考

Laravelのphp artisan migrateでSQLSTATE[HY000] [2002] Connection refusedが返る - Qiita

https://niwacan.com/1408-laravel-db-ini/

【初心者】【Laravel5.3】【Mac】ローカルでMySQLとの接続エラーに対応する - Qiita

Laravelでのmigrationでエラーが起きる - Qiita

はじめてのLaravel

Laravelを学ぶために

上記で学習しようと思います。

では早速。

昨日とりあえず立ち上げたので、「1-3-3 はじめてのページ」からスタート。

目標

http://homestead.test/homeで新規ページを表示し、テストする。

手順1 ルーティングの設定

手順2 viewの作成

手順3 テスト

一瞬テストが無反応で?になったが、末尾の;が抜けていただけだった。 (テストコードのエラーはノーリアクションなのか。。。)

今日は以上。

JavaScript その1

JavaScript

今まで深く考えずに書いてきたが、改めて理解する必要があると感じたので、少しまとめます。

今回はJavaScriptの「this」です。

thisにはいくつかパターンがある

①メソッド呼び出し

メソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。

var testObject = {
  value: 10,
  show: function() {
    console.log(this.value);
  }
}
testObject.show();

②関数呼び出し

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。

function show() {
  console.log(this);
  this.value = 1;
}
show();

まぎらわしい例(メソッド内で関数呼び出しになっている)

var testObject = {
  value: 1,
  show: function() {
    console.log(this.value);

    function show() {
      console.log(this.value); // グローバルを指す
    }
    show();
  }
};
testObject.show();

解決策

var testObject = {
  value: 1,
  show: function() {
    var self = this;
    console.log(self.value);

    function show() {
      console.log(self.value);
    }
    show();
  }
};
testObject.show();

③コンストラクタ呼び出し

function TestObject(value) {
  this.value = value;
  this.increment = function() {
    this.value++;
  };
}
var test = new TestObject(0);
// var test = TestObject(0); // newをつけないと。。
console.log(test.value);

test.increment();
console.log(test.value);

「new」をつけないと関数呼び出しとなり、「this」はグローバルオブジェクトを指す。

④apply,call呼び出し (thisを指定できる)

var testObject = {
  add: function(value1, value2) {
    console.log(this.value + value1 + value2);
  }
};
var fooObject = {
  value: 3
};

testObject.add.apply(fooObject, [2, 10]);
testObject.add.call(fooObject, 2, 10);

⑤bind()のthis

bind() メソッドは、呼び出された時に新しい関数を生成します。最初の引数 thisArg は新しい関数の this キーワードにセットされます。2 個目以降の引数は、新しい関数より前に、ターゲット関数の引数として与えられます。

function test() {
    console.log(this)
}
var obj = { name: "obj" }
var check = test.bind(obj)
check()

まとめ

thisのパターン
①メソッド呼び出し
②関数呼び出し
③コンストラクタ呼び出し
④apply,call呼び出し (thisを指定できる)
⑤bind()のthis

thisを使う時は呼び出し元を確認する必要がある。

参考

JavaScript中級者への道【2. 4種類のthis】 - Qiita

JavaScriptの「this」は「4種類」?? - Qiita

JavaScript の this を理解する多分一番分かりやすい説明 - Qiita

関数とメソッドの違いがわからなくて少し調べたので自分なりにまとめてみた - Qiita

PHPのstaticについて

static(静的)とは?


PHPでのstaticの意味は3つある

1, 静的なメソッド・プロパティを定義するためのstatic
2, 静的変数を定義するためのstatic
3, メソッドのスコープを定義するための遅延静的束縛の意味でのstatic


1, 静的なメソッド・プロパティを定義するためのstatic

staticメソッドはオブジェクトのインスタンスを生成せずに コールすることができる。これを静的コールと言う。
インスタンス化されたクラスオブジェクトからメソッドやプロパティにアクセスすることを動的コールと言う。
静的なプロパティを動的コールすることは出来ないが、静的なメソッドを動的コールすることは可能。

class Foo {
  public static $property = 'foo';
  public static function method() {
    echo 'bar';
    }
}

echo Foo::$property.PHP_EOL;

Foo::method(); 

$test = new Foo;
$test->method();

// echo $test->property;
2, 静的変数を定義するためのstatic

静的変数はローカル関数スコープのみに 存在するが、プログラム実行がこのスコープの外で行われるようになっ てもその値を失わない。

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}
test();
test();
test();
3, メソッドのスコープを定義するための遅延静的束縛の意味でのstatic

の前に
・スコープを表す「スコープ定義演算子」まとめ

記述方法 スコープ 記述場所
1 クラス名:: 明示されたクラス クラス定義の外or中
2 self:: self::が記載されたクラス クラス定義の中
3 parent:: parent::が記載されたクラスの親クラス クラス定義の中
4 static:: 直近の "非転送コール" のクラス クラス定義の中
遅延静的束縛?

遅延静的束縛(Late Static Bindings)とは、「非転送コール」によって呼ばれたメソッド・クラス名を保持する機能です。
static::では、遅延静的束縛によって保持するクラスのメソッド(またはプロパティー)をコールします。

転送コール」と「非転送コール」

・非転送コール→Foo::test()や$foo->test()といったクラス名(もしくはオブジェクト)を明示した呼び出し

・転送コール→メソッド内でself::、parent::、static::を使用して行われる呼び出し

class A {
    public static function who() {
        echo 'A';
    }
    public static function test() {
        static::who();
    }
    public static function test2() {
        self::who();
    }
}
 
class B extends A {
    public static function who() {
        echo 'B';
    }
}
 
B::test();

まとめ

今までなんとなく使っていた"static"に、様々な意味があると初めて知りました。 静的、動的という言葉もあやふやだったので、今回ようやく意味が分かりました。

参考

PHP: static キーワード - Manual

PHP: スコープ定義演算子 (::) - Manual

mana's note: 遅延静的束縛について理解しよう

PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記

【PHP入門】クラス変数・クラスメソッドを使用する方法(static) | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

PHPのオブジェクト指向入門 | オブジェクト指向PHP.NET