PHP言語の素で自分もやってみた🙆
2024.06.16
おはようございます、素のPHP言語でストリーミングダウンロードしてみました.仕事でつい最近、そのような事をLaravelで行ったわけですけど、素のPHPではどんな感じであろうかと思ったのと株式会社Oさんのブログでもストリーミングダウンロードでメモリ不足解消という記事を見つけたので自分の知見で書いてみました.
<?php
class streamDownload
{
public $flg = false;
public $fileName = '';
public $to_encoding = 'sjis';
public $from_encoding = 'UTF-8';
public function __construct($fileName,$to_encoding = 'sjis',$from_encoding = 'UTF-8')
{
$this->fileName = $fileName;
return $this;
}
public function checkSplFileInfo()
{
if((new SplFileInfo($this->fileName))->getExtension() === 'csv'){
$this->flg = true;
}
return $this;
}
public function download($data)
{
if(!$this->flg){
return $this->flg;
}
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$this->fileName);
$stream = fopen('php://output', 'w');
foreach ($data as $row) {
$row = mb_convert_encoding($row,$this->to_encoding,$this->from_encoding);
fputcsv($stream, $row);
}
fclose($stream);
exit;
}
}
$data = [
['テスト1', '高知太郎', 'abc@example.com'],
['テスト2', '高知花子', 'def@example.com'],
['テスト3', '高知喜多郎', 'dev@example.com'],
];
(new streamDownload('test.csv'))->checkSplFileInfo()->download($data);
このコードはCSVファイルをエクセルで開くことを想定して記載しています.要のデータ処理はあのような配列で渡せば何万件もの処理でも基本落ちません.
なお要のデータ処理はご自身で考える必要があります、あくまでも雛形です.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$flg, abc@example.com, application, attachment, construct, Content-Disposition, def@example.com, download, exit, fclose, filename, fopen, foreach, getExtension, header, Laravel, octet-stream, ストリーミングダウンロード,
使わないうちに書き方が変わっていましたMySQL。
2015.05.10
MySQLなんて全然、PHPで呼び出すコードをココ数年書かなくても何も困ること無く生きてきた自分です。その間にもPHPのバージョンが更新されていました。最近使わなかったMySQLでも触ってみようかなとググると目から鱗!!。いつの間にか書き方が微妙に変わってましてDBに接続したりクエリを呼び出したりするのが何だか前より楽になっているような気がします。前のことを殆ど忘れてしまったのでどうこう言えないのですが、何だかこの書き方は覚えやすいなと思います。ちなみに自分はいろいろと浅く広くいろいろな言語に手を出しているので・・・これと言って超強みはないのですが、DB周りは本当に触る機会がなくてあんまり無いですが、DBを使ったものをなにか作りたいなと思っています。
function selctsql(){ $mysqli = new mysqli("host","user","pass","DBname"); if ($mysqli->connect_error){ print("接続失敗:" . $mysqli->connect_error); exit(); } $result = $mysqli->query("SELECT * FROM test ORDER BY id DESC"); if($result){ //1行ずつ取り出し while($row = $result->fetch_object()){ //エスケープして表示 $hoge[0] = $row->qur1; $hoge[1] = $row->qur2; } } return $hoge; }
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
AM, connect_error, dbname, exit, fetch_object, FROM test ORDER BY id DESC, function selctsql, hoge, mysqli, new mysqli, query, qur1, qur2, result, return, row, select, クエリ, バージョン, 接続失敗, 書き方,
び?え?てぃ?バッチ処理、えぇもう披露困憊です(´Д`)。
2015.01.21
バッチ処理ってモノは自分苦手です。生まれてこの方、バッチなんてものを触る機会がなかったのえぇもう披露困憊ですって言うのは嘘ですが、はっきり言って使い分けがイマイチなんですね。この頃、バッチ処理で出来ることはバッチで投げてあるべきだと言う事を認識しました。その方が処理が早いですからね。昨日、バッチ処理のボットさんと一悶着あったので綴ります。ボットと言っている割にはボットサービスを使ったボットかよ!とツッコミどころがありましたが、質問しているとそれなりにバッチ処理を理解しているかなと思ったので深く質問しているうちに自分の書いたバッチ処理が間違いに気づきました。
家に帰ってバッチ処理を見てみると案の定、javascriptの関数名をバッチ処理に書いていたというオチです。まさに何やっているだという感じです。
こういうのあまり参考にならないかもしれませんが掲載しておきます。あるホームページをIEブラウザを開いてある処理を実行したあとブラウザで閉じるというバッチです、今回はある処理に関してのコードは記載しません。尚、ブラウザを開いてから処理が終わるまでの感覚を5秒とします。
start "C:Program FilesInternet Exploreriexplore.exe" "https://google.co.jp" timeout /t 5 taskkill /f /im iexplore.exe exit
※デフォルトでIEが開く状態になっていないとブラウザは閉じません(´Д`)ので注意してください。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
AM, exit, IEブラウザ, im iexplore.exe, javascript, Program FilesInternet Exploreriexplore.exe, t 5, taskkill, timeout, えぇもう披露, えぇもう披露困憊, ツッコミどころ, デフォルト, バッチ処理, ブラウザ, ホームページ, ボット, ボットサービス, 一悶着, 体, 使い分け, 関数名,