20191230のPHPに関する記事は7件です。

PHP 逆ポーランド記法

逆ポーランド記法とは

  • 被演算子の後ろに演算子を表記する演算記法。
  • 後置記法(Reverse Polish Notation, RPN)という。
  • 10+20 → 10 20 +

主な手順

  • 式を一つ一つ分割し、演算子以外であればスタックに積む(PUSH)。
  • 演算子であればスタックから数字を取り出す(POP)。
  • 演算結果をスタックに積む。
<?php
function calcRPN($str)
{
    // 式を空白文字でトークンに分割する
    $tokens = preg_split('#\s+#', trim($str));
    $stack = []; // スタックを準備
    foreach ($tokens as $t) {
        // 数値
        if (preg_match('#^[0-9\.]+$#', $t)) {
            $stack[] = floatval($t);
            continue;
        }
        // 四則演算
        $b = array_pop($stack); //スタックの末尾から要素を取り除く
        $a = array_pop($stack);
        switch ($t) {
            case '+':
                $c = ($a + $b);
                break;
            case '-':
                $c = ($a - $b);
                break;
            case '*':
                $c = ($a * $b);
                break;
            case '/':
                $c = ($a / $b);
                break;
            case '%':
                $c = ($a % $b);
                break;
            default:
                return "error";
        }
        $stack[] = $c; //演算結果をスタック末尾に入れる
    }
    return array_pop($stack);
}

$str = '10 20 30 * + 40 - 50 +';
echo calcRPN($str); //620
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

bashでhealth check

bashでhealth checkのめも

php-fpmとcrondを監視します

#!/bin/bash

while true
  do
      PHP=`sudo ps ax | grep 'php-fpm: master' | grep -v grep | wc -l`
      CROND=`sudo ps ax | grep 'crond' | grep -v grep | wc -l`
      if [ $PHP = 1  ] && [ $CROND = 1  ] ; then
          echo "HTTP/1.0 200 Ok"  | nc -l 8080
      else
          echo "HTTP/1.0 500 NG"  | nc -l 8080
      fi
      [ $? != 0 ] && break
  done

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

?【Laravel】register_shutdown_function()使うときは配列にして$thisも渡す

環境

PHP 7.3.10
Laravel 6.5.0

やりたいこと

関数の実行終了前に任意の関数呼び出すregister_shutdown_function()をLaravelで使いたい
が、こいつを書くと下記の例外が発生する

ErrorException
register_shutdown_function(): Invalid shutdown callback 'HogeHoge' passed

どうやらインスタンスメソッドである「$this」を渡さないといけない様子

やったこと

引数を配列にして$thisと対象の関数名を渡す

HogeController.php
    /**
     * 完了前にコールバックを呼び出したい関数
     *
     * @param Request $request
     */
    public function doSomething(Request $request) {
        // 色々処理します
        // ...

        // ❌例外発生パターン
        register_shutdown_function('HogeHoge');
        // ?これで実行できます
        register_shutdown_function([$this, 'HogeHoge']);

        return back();
    }

    /**
     * 実行完了時に呼びだされるコールバック関数
     *
     * @return void
     */
    public function HogeHoge(): void {
        // ログ作成、終了処理等の何かをする
        // ...
    }

結果

例外なく呼び出せます
$thisじゃなくても指定できそうにも見えます

CakePHPでも同じ方法で解決できました

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

パフォーマンスのために生まれたPHP Excel拡張機能xlswriter 1.3.3がリリースされました!

xlswriterは、Excel 2007+ XLSXファイルからデータを読み取り、複数のシートを挿入し、テキスト、数値、数式、日付、チャート、写真、ハイパーリンクを書き込むために使用できるPHP C拡張です。

以下の機能があります。

I.書き込み

100%互換性のあるExcel XLSXファイル
-完全なExcel形式
-セルの結合
-ワークシート名を定義する
-フィルター
-チャート
-データの検証とドロップダウンリスト
-ワークシートPNG​​ / JPEG画像
-大きなファイルを書き込むためのメモリ最適化モード
Linux、FreeBSD、OpenBSD、OS X、Windowsで実行
-32ビットおよび64ビットにコンパイル
-FreeBSDライセンス
-唯一の依存関係はzlibです

次に、読みます

-データを完全に読み取る
-カーソル読み取りデータ
-データ型による読み取り
-xlsxからCSV

#ベンチマーク

テスト環境:Macbook Pro 13インチ、Intel Core i5、16GB 2133MHz LPDDR3メモリ、128GB SSDストレージ。

エクスポート

2つのメモリモードで100万行のデータをエクスポートできます(1行あたり27列、データタイプは文字列、文字列の長さは19)

-通常モード:時間のかかる「29S」、メモリのみ「2083MB」が必要です。
-固定メモリモード:52Sのみ、メモリ<1MBのみ。

インポート

100万行を超えるデータ(単一行、1列、データ型はINT)

-フルボリュームモード:「3S」には時間がかかり、「558MB」のメモリのみ。
カーソルモード:時間のかかる「2.8S」、メモリのみ「<1MB」。

#クイックスタート

エクスポート

$excel = new  \Vtiful\Kernel\Excel(['path' => '/home/viest']);

// fileName 会自动创建一个工作表,你可以自定义该工作表名称,工作表名称为可选参数
$filePath =  $excel->fileName('tutorial01.xlsx', 'sheet1')
    ->header(['Item',  'Cost'])
    ->data([
        ['Rent',  1000],
        ['Gas',  100],
        ['Food',  300],
        ['Gym',  50],
    ])
    ->output();

インポート

$excel = new \Vtiful\Kernel\Excel(['path' => './tests']);

$filePath =  $excel->fileName('tutorial.xlsx')
    ->header(['Item', 'Cost'])
    ->output();

$data = $excel->openFile('tutorial.xlsx')
    ->openSheet()
    ->getSheetData();

var_dump($data); // [['Item', 'Cost']]

XLSXtoCSV [通常モード]

適用シナリオ

-より多くのxlsxファイルフラグメントを統合処理のために1つのCSVファイルにマージします。
-xlsxファイルは、タスク処理速度よりも速く追加されます。ファイルが非同期でCSVに変換された後、より効率的なツール(たとえば、データベースツールがCSVを直接インポートする)で処理できます。

demo.php

$excel = new \Vtiful\Kernel\Excel(['path' => './tests']);

$filePath = $excel->fileName('tutorial.xlsx', 'TestSheet1')
    ->header(['String', 'Int', 'Double'])
    ->data([
        ['Item_1', 10, 10.9999995],
    ])
    ->output();

$fp = fopen('./tests/file.csv', 'a');

$resultBoolOne = $excel->openFile('tutorial.xlsx')
    ->openSheet()
    ->putCSV($fp);

$resultBoolTwo = $excel->openFile('tutorial.xlsx')
    ->openSheet()
    ->putCSV($fp);

file.csv

String,Int,Double
Item_1,10,10.9999995
String,Int,Double
Item_1,10,10.9999995

Xlsx移行CSV [コールバックモード]

このアプリケーションシナリオは従来のモデルと似ていますが、上位レベルの企業はコールバック関数を使用してデータを処理し、xlsxを使用してデータをフィルター処理し、csvに書き込むことができます。

ドキュメントの他の機能を見る

https://xlswriter-docs.viest.me

倉庫住所

GitHub:https://gitee.com/viest/php-ext-xlswriter

PECL:https://pecl.php.net/package/xlswriter

終わり

それがあなたを助けるなら、私に星をください

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

PHP,Pythonでの一時的なAWS認証情報の取得

はじめに

AWSのEC2にアクセスキーを発行するのはアンチパターン。
キーが盗まれて使われることがあるので、キーは発行しないのが一番良い。
EC2にIAMロールっていう一時的なアクセスキーを発行するのが良いパターン。

Pythonで使う

run.py
import boto3

session = boto3.session.Session(profile_name='prodaccess')
credentials = session.get_credentials()

# この値をbotoとかで自由に使って。
print(credentials.access_key)
print(credentials.secret_key)
print(credentials.token)

boto3を使った一時的なAWS認証情報の取得

PHPで使う

Laravelで使う

aws-sdk-php-laravelってライブラリがある。

aws-sdk-php-laravel
IAM Roleを使ってAWS ElasticSearch ServiceのデータをLaravelで取得する
公式 AWS SDK for PHP への一時認証情報の提供

composer require aws/aws-sdk-php
composer.json
{
    "require": {
        "aws/aws-sdk-php-laravel": "~3.0"
    }
}

公式の通りだけど

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

PHP 変数を文字列中で展開する。

目的

  • 変数に格納された内容を文字列中で展開して表示する方法をまとめる

書き方の例

  • 下記に変数Aに格納された内容を文字列中で展開して表示する処理を記載する。
echo "任意の文字列{$変数A}任意の文字列";

より具体的な書き方の例

  • 下記に変数nameに格納された内容を文字列中で展開して表示する処理を記載する。
//変数に内容の格納
$name = "みりを";

echo "おはようございます{$name}さん";
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 変数を文字列中で展開する

目的

  • 変数に格納された内容を文字列中で展開して表示する方法をまとめる

書き方の例

  • 下記に変数Aに格納された内容を文字列中で展開して表示する処理を記載する。
echo "任意の文字列{$変数A}任意の文字列";

より具体的な書き方の例

  • 下記に変数nameに格納された内容を文字列中で展開して表示する処理を記載する。
//変数に内容の格納
$name = "みりを";

echo "おはようございます{$name}さん";
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む