Allowed memory size of 134217728 bytes exhausted

5万行くらいあるcsv(上場企業の決算全データ)を処理したいのですが、

走らせたところ
192.168.33.1:50210 [500]: / – Allowed memory size of 134217728 bytes exhausted (tried to allocate 8388608 bytes) in /home/vagrant/equity/index.php on line 4

下記を追加して再度リクエスト

ini_set('memory_limit', '512M');
ini_set('memory_limit', '512M');

$pass = "csv/account.csv";
$data = file($pass, FILE_IGNORE_NEW_LINES);

unset($data[0]);

function cut($item){
    return explode(',', $item);
}
$data = array_map("cut", $data);
foreach ($data as $value){
    $code[]= $value[0];
}

var_dump($code);

ああああああああ、もう駄目だ
嫌になってきた、今日は終了

echo mb_detect_encoding($data); で判定すると、”UTF-8″と表示されるんだが、何故??
UTF-8,UTF-7,ASCII,EUC-JP,eucJP-win,SJIS,SJIS-win,JIS,ISO-2022-JP,Unicode全部あかんやん。
ちくしょー

ログインフォーム

<?php
header("Content-type: text/html; charset=utf-8");

define("ID", "vagrant");
define("PASSWORD", "asdf");

$post_id = @$_POST&#91;"id"&#93;;
$post_password = @$_POST&#91;"password"&#93;;
$val1 = @$_POST&#91;"val1"&#93;;
$val2 = @$_POST&#91;"val2"&#93;;
$val3 = @$_POST&#91;"val3"&#93;;

$mass = $val1 + $val2;

if($post_id == ID && $post_password == PASSWORD && $mass == $val3){
	echo "<p>ログイン成功</p>";
} elseif(!@$_POST){
	login_form();
} else {
	if($mass == $val3){
		echo "<p>ログイン失敗 IDまたはPASSWORDが間違っています。</p>";
	} else {
		echo "<p>ログイン失敗 計算の答えが間違っています。</p>";
	}
	login_form();
}

function login_form(){

	$rand1 = rand(0,9);
	$rand2 = rand(0,9);

	echo <<<LOGINFORM
	<!DOCTYPE html>
	<html lang="ja">
	<body>
	<form action="" method="post" id="login">
		<input type="text" name="id" placeholder="id">
		<input type="password" name="password" placeholder="password">
		<input type="text" name="val1" style="display:none;" value="{$rand1}">
		<input type="text" name="val2" style="display:none;" value="{$rand2}">
		<input type="text" name="val3" placeholder="{$rand1}+{$rand2}=の答えを入力">
		<input type="submit" value="ログイン">
	</form>
	</body>
	</html>
LOGINFORM;
}
?>

PDO create tableで4000個テーブルを作る時間

銘柄リストから、それぞれのテーブルを作っていきます。sqlにはif not existsを入れます。

$time_start = microtime(true);
$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select code from lists";
$stmt = $dbh->query($sql);
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
		$code[] = $result["code"];
}


foreach($code as $value){
	$sql = "create table if not exists equity.code".$value."(
		id int unsigned auto_increment primary key,
		date int,
		close int
	)ENGINE = MYISAM;";
	$stmt = $dbh->query($sql);
}

$time = microtime(true) - $time_start;
echo "{$time}秒";

mysql側 入ってます。

経過時間:35秒

問題は次ですが、
アップデートがなかった場合:11.73秒

localで走らせるので、そこまで大きな問題ではなさそうですね。
一からもう一度やってみましたが、大体同じ時間です。

試しにgoogle financeから1個データを入れてみます。

これは。。。かなりやる気なくなってきた。

PDOでcreate table

$time_start = microtime(true);
$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$code= '2338';

$sql = "create table equity.code".$code."(
	id int unsigned auto_increment primary key,
	date int,
	close int
)ENGINE = MYISAM;";
$stmt = $dbh->query($sql);

$time = microtime(true) - $time_start;
echo "{$time}秒";

mysql 重複を除いた値の一覧抽出

以下で取得可能です。
SELECT DISTINCT colname FROM tablename;

mysql> select distinct sector from lists;
+————————–+
| sector |
+————————–+
| 水産・農林業 |
| 卸売業 |
| 建設業 |
| 非鉄金属 |
| 鉱業 |
| 機械 |
| サービス業 |
| 金属製品 |
| 情報・通信 |
| 食料品 |
| 医薬品 |
| 不動産業 |
| 陸運業 |
| その他金融業 |
| 小売業 |
| その他製品 |
| 繊維製品 |
| 電気機器 |
| ガラス・土石製品 |
| 証券業 |
| 輸送用機器 |
| REIT銘柄一覧 |
| 石油・石炭製品 |
| 化学 |
| パルプ・紙 |
| 精密機器 |
| ゴム製品 |
| 鉄鋼 |
| 銀行業 |
| 保険業 |
| 倉庫・運輸関連業 |
| 海運業 |
| 空運業 |
| 電気・ガス業 |
+————————–+
34 rows in set (0.05 sec)

早く気づけばよかった。

DBから同業種・同じ市場の銘柄を抽出する

select * from table where で条件を記載します。

$code = empty($_GET["code"])? 'null' : $_GET["code"];

$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 


$sql = "select * from lists where code = $code";
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
$sector = $result['sector'];
$market = $result['market'];

echo "<b>".$result['name']. "</b>(".$code.") ";
echo $result['sector'] ." ".$result['market']. "<br><br>";
echo "同業種の銘柄(".$sector.")"."<br>";

$sql2 = "select * from lists where market = '$market' AND sector = '$sector' and code != $code";
$stmt2 = $dbh->query($sql2);
while($result = $stmt2->fetch(PDO::FETCH_ASSOC)){
	    echo $result["code"]." ".$result["name"]. "<br>";
}

パラメータを$_GETで受け取る

echo $_GET["code"];

コードの情報をDBから取得する

$time_start = microtime(true);

$code = empty($_GET["code"])? 'null' : $_GET["code"];
echo $code. "<br>";

$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from lists where code = $code";
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
 
echo $result['name']. "<br>";
echo $result['sector']. "<br>";
echo $result['market']. "<br>";

echo "<br>";
$time = microtime(true) - $time_start;
echo "{$time}秒";

OK!

パラメータからデータを読み込む

パラメータを変える

なるほど

さくら共有サーバー cake3.5インストール後の.htaccessの設定

www/cake/に testというappを作っています。
それぞれのhtaccessのRewriteBaseでカレントディレクトリを指定してあげます。

/cake/.htaccess

  
   RewriteEngine on  
   RewriteRule    ^$ test/webroot/    [L]  
   RewriteRule    (.*) app/webroot/$1 [L]  
   RewriteBase /  
  

/cake/test/.htaccess

  
    RewriteEngine on  
    RewriteRule    ^$    webroot/    [L]  
    RewriteRule    (.*) webroot/$1    [L]  
    RewriteBase /test
  

/cake/test/webroot/.htaccess


    RewriteEngine On
    RewriteBase /test/webroot
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

きたー

ここまでもってくるの、結構煩雑だな~
VPSの方が簡単にセットアップできるという謎現象ですね。

さくらサーバーでintlを入れた後にcakephp3.5エラー

intlも入ったし、さあ、確認とおもったら、

php composer.phar create-project --prefer-dist cakephp/app myapp

Problem 1
– cakephp/cakephp 3.5.9 requires ext-intl * -> the requested PHP extension intl is missing from your system.

これはがっかりしますね。
確かに、php -i | grep intlで何も表示されない。

原因は、この php.ini は/usr/local/php/5.6/lib/php.iniの方を読み込んでいるから。
コントロールパネルで設定したphp.iniの方は、

php -c /home/[username]/www/php.ini -i | grep intl 

で表示される。

というわけで、cake3.5を入れる際も、以下のように打ちます。

php -c /home/[username]/www/php.ini composer.phar create-project --prefer-dist cakephp/app test

こんどは上手くいってるようです。