29652


**やりたいこと**  
・MySQLから取得したデータを、cronを使用して一日一回、順番に1件づつ投稿したい  
・例えば期間半年をかけて

**疑問**  
・配列形式で取得した場合、前回投稿した順番をどうやって把握すれば良いでしょうか？

**案1**  
・その時点の番号をファイル出力して、翌日読込

**案2**  
・「最初に投稿した日」と「実際に投稿する日」の差分で計算  
・「最初に投稿した日」は結局どこかに保存しなければいけない？ もしくは「マジックナンバー」として指定？

**質問**  
・こういった場合、普通はどうやるのでしょうか？


CC BY-SA 3.0
2016-10-17T12:53:01.630
29632
2016-11-01T05:26:31.417
7886
question
php
長期でstaticな値を使い回したい


PHPでstaticを共有することは、基本的にできないですね。

質問の認識が間違っているかもしれないので、確認の為、少し値を変えて解釈を記載します。  
■一週間分（７レコード）のデータを、特定の順番で１日ごとに処理していきたい  
※日数 ：1⇒2⇒3⇒4⇒5⇒6⇒7⇒8⇒9⇒....  
※データ：A⇒B⇒C⇒D⇒E⇒F⇒G⇒A⇒B⇒....

上記の場合、  
■方法１（単純）※この方式の場合、途中でデータが増えると駄目（増えたデータを手メンテすればOK）  
１．初期状態（全未処理）の「優先順位」のカラムを用意する  
２．「投稿した日時」を保持するカラムを用意する  
３．その日のレコードを取得する際に、「投稿した日時」の昇順、優先順位の昇順の１レコード目がその日に投稿するデータになる  
※MYSQLは昇順の場合NULLが先頭になる、１日ごとの場合、投稿日が一番古いデータが自動的にその日の投稿データになる

[code]

    ・１日目（2016/10/01）
    SELECT * FROM 投稿情報テーブル ORDER BY 投稿日, 優先順位 LMIT 1;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿した日時 |
    +----------+------------+--------------+
    |        1 |          A |         NULL | ←　投稿日がNULLなので「優先順位」の昇順の１件目が投稿データ（投稿処理ごに投稿日に日付を設定する）
    +----------+------------+--------------+
    |        2 |          B |         NULL |
    +----------+------------+--------------+
    |        3 |          C |         NULL |
    +----------+------------+--------------+
    |        4 |          D |         NULL |
    +----------+------------+--------------+
    |        5 |          E |         NULL |
    +----------+------------+--------------+
    |        6 |          F |         NULL |
    +----------+------------+--------------+
    |        7 |          G |         NULL |
    +----------+------------+--------------+
    
    ・２日目（2016/10/02）
    SELECT * FROM 投稿情報テーブル ORDER BY 投稿日, 優先順位 LMIT 1;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿した日時 |
    +----------+------------+--------------+
    |        2 |          B |         NULL |←　MYSQLは昇順の場合NULLが先頭になる為、「投稿日」が設定されていないデータの「優先順位」の昇順の１件目が投稿データ（投稿処理ごに投稿日に日付を設定する）
    +----------+------------+--------------+
    |        3 |          C |         NULL |
    +----------+------------+--------------+
    |        4 |          D |         NULL |
    +----------+------------+--------------+
    |        5 |          E |         NULL |
    +----------+------------+--------------+
    |        6 |          F |         NULL |
    +----------+------------+--------------+
    |        7 |          G |         NULL |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/01 | ←　MYSQLは昇順の場合NULLが先頭になる為、日付が設定されたデータは最後になる
    +----------+------------+--------------+
    
    ※１日ごとに上記処理を繰り返す
    ・・・
    ８日目（2016/10/08）
    SELECT * FROM 投稿情報テーブル ORDER BY 投稿日, 優先順位 LMIT 1;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿した日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/01 | ←　「投稿日」が全て設定されている為、「投稿日」の昇順の１件目が投稿データ
    +----------+------------+--------------+
    |        2 |          B |   2016/10/02 |
    +----------+------------+--------------+
    |        3 |          C |   2016/10/03 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/04 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/05 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/06 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/07 |
    +----------+------------+--------------+
    
    ９日目（2016/10/09）
    SELECT * FROM 投稿情報テーブル ORDER BY 投稿日, 優先順位 LMIT 1;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿した日時 |
    +----------+------------+--------------+
    |        2 |          B |   2016/10/02 | ←　「投稿日」が全て設定されている為、「投稿日」の昇順の１件目が投稿データ
    +----------+------------+--------------+
    |        3 |          C |   2016/10/03 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/04 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/05 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/06 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/07 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/08 | ←　「投稿日」に投稿した日付を設定する為、日付が設定されたデータは最後になる
    +----------+------------+--------------+
    
[/code]

■方法２（初期化方式）  
１．初期状態（全未処理）の「優先順位」のカラムを用意する  
２．最後に「投稿する日付」を保持するカラムを用意する  
３．当日の投稿データを取得して、データが存在したら投稿、  
存在しない場合、優先順位に従って、その日からの投稿日時を各レコードに設定していく  
※この日付設定処理のときに未来日のデータがあったらどうするとかを処理する

[code]

    ・１日目（2016/10/01）
    SELECT * FROM 投稿情報テーブル WHERE 投稿する日時 = 今日の日付;
    ※初期の段階で投稿する日付を設定しておく
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿する日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/01 | ←　投稿データ
    +----------+------------+--------------+
    |        2 |          B |   2016/10/02 |
    +----------+------------+--------------+
    |        3 |          C |   2016/10/03 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/04 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/05 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/06 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/07 |
    +----------+------------+--------------+
    
    
    ・１日目（2016/10/02）
    SELECT * FROM 投稿情報テーブル WHERE 投稿する日時 = 今日の日付;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿する日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/01 |
    +----------+------------+--------------+
    |        2 |          B |   2016/10/02 | ←　投稿データ
    +----------+------------+--------------+
    |        3 |          C |   2016/10/03 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/04 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/05 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/06 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/07 |
    +----------+------------+--------------+
    
    ※１日ごとに上記処理を繰り返す
    ・・・
    
    ・８日目（2016/10/08）
    SELECT * FROM 投稿情報テーブル WHERE 投稿する日時 = 今日の日付;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿する日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/01 |
    +----------+------------+--------------+
    |        2 |          B |   2016/10/02 | 
    +----------+------------+--------------+
    |        3 |          C |   2016/10/03 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/04 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/05 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/06 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/07 |
    +----------+------------+--------------+
                                            ←　投稿データがない
    
    「投稿する日付」を優先順位に従って今日の日付から再設定する
    SELECT * FROM 投稿情報テーブル WHERE 投稿する日時 = 今日の日付;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿する日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/08 | ←　投稿データ
    +----------+------------+--------------+
    |        2 |          B |   2016/10/09 | 
    +----------+------------+--------------+
    |        3 |          C |   2016/10/10 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/11 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/12 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/13 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/14 |
    +----------+------------+--------------+
    
    ・９日目（2016/10/09）
    SELECT * FROM 投稿情報テーブル WHERE 投稿する日時 = 今日の日付;
    +----------+------------+--------------+
    | 優先順位 | 投稿データ | 投稿する日時 |
    +----------+------------+--------------+
    |        1 |          A |   2016/10/08 |
    +----------+------------+--------------+
    |        2 |          B |   2016/10/09 | ←　投稿データ
    +----------+------------+--------------+
    |        3 |          C |   2016/10/10 |
    +----------+------------+--------------+
    |        4 |          D |   2016/10/11 |
    +----------+------------+--------------+
    |        5 |          E |   2016/10/12 |
    +----------+------------+--------------+
    |        6 |          F |   2016/10/13 |
    +----------+------------+--------------+
    |        7 |          G |   2016/10/14 |
    +----------+------------+--------------+
    
[/code]


CC BY-SA 3.0
2016-10-18T05:30:10.067
29652
2016-10-20T02:17:52.203
2016-10-20T02:17:52.203
19001
19001
29632
answer


投稿後、投稿した日時を更新できるのなら、次の投稿すべきレコードは以下のクエリで取得できます。

[code]

    SELECT *
      FROM 投稿データ
     WHERE 投稿した日時 IS NULL
     ORDER BY 優先順位
     LIMIT 1
    
[/code]


CC BY-SA 3.0
2016-11-01T05:26:31.417
30031
2016-11-01T05:26:31.417
19392
29632
answer