PHP でブラウザから job を投入する。電子実験ノートを自作してみた!導入コストゼロ!(4/5)

前回に引き続き、電子実験ノートの自作の記事です。

今回は、電子実験ノートから計算機に job を投入し、同時にノートを作成する機能を実装していきます。

参考電子実験ノートを自作してみた!導入コストゼロ!(1/5)
参考リアルタイムで計算状況を表示するシステムの構築!【電子実験ノートを自作してみた!導入コストゼロ!】(2/5)
参考CRUD を実装!電子実験ノートを自作してみた!導入コストゼロ!(3/5)
参考ログイン機能を実装する。電子実験ノートを自作してみた!導入コストゼロ!(5/5)

構成

  1. html で入力フォームを作成する。POST メソッドと SESSION メソッドを組み合わせて変数を受け渡す。
  2. 計算機にリモートログインし、job を投入する。
  3. MySQL にデータを登録

今回の記事で必要なファイルは下リンクからダウンロードしてください。

入力フォームの作成

前回の記事と同様に <form> ファグで入力フォームを作成します。

<form action="" method="post" enctype="multipart/form-data">
                        <dl>
                            <dt>計算 input ファイルを選択<span class="required">(必須)</span></dt>
                            <dd>
                                <input type="file" name="input_file" size="35" placeholder="input file"  />
                                <?php if($error['input_file'] == 'type'): ?>
                                <p class="error">*input ファイルは、[.com]または[.gjf]のファイルを指定して下さい</p>
                                <?php endif; ?>
                                <?php if (!empty($error)): ?>
                                <p class="error">*計算 input ファイルを正しく指定して下さい</p>
                                <?php endif; ?>
                            </dd>
                            <dt>local_path を入力(入力がない場合は、/Users/username/Downloads)</dt>
                                <dd>
                                <input type="text" name="input_file" size="60" maxlength="80" placeholder="/Users/username/Downloads" value="<?php print(htmlspecialchars($_POST['local_path'], ENT_QUOTES)); ?>" />
                                </dd>
                            <dt>計算機を選択<span class="required">(必須)</span></dt>
                            <dd>
                                <select name='machine'>
                                <option value='7960x'>7960x</option>
                                <option value='ripper'>ripper</option>
                                <option value='3900x'>3900x</option>
                                </select>
                                <?php if($error['remote_path'] == 'blank'): ?>
                                <p class="error">*ファイルアップロード先を指定して下さい</p>
                                <?php endif; ?>
                            <dt>ファイルアップロード先(例: /home/intel7960x/project1/ts)<span class="required">(必須)</span></dt>
                            <dd>
                                <input type="text" name="remote_path" size="60" maxlength="80" placeholder="アップロード先" value="<?php print(htmlspecialchars($_POST['remote_path'], ENT_QUOTES)); ?>" />
                                <?php if($error['remote_path'] == 'blank'): ?>
                                <p class="error">*ファイルアップロード先を指定して下さい</p>
                                <?php endif; ?>
                            </dd>
                            <dd>
                                <dt>計算の種類</dt>
                                <input type="text" name="calculation" size="60" maxlength="80" placeholder="計算の種類(opt, freq, NMR, scan, etc.)" value="<?php print(htmlspecialchars($_POST['calculation'], ENT_QUOTES)); ?>" />
                            </dd>
                            <dd>
                                <dt>計算の内容(ジョブ投入と同時に自動的にノートに記入)</dt>
                                <textarea rows="5" cols="50" placeholder="計算の内容" name="content" value="<?php print(htmlspecialchars($_POST['content'], ENT_QUOTES)); ?>"></textarea><br />
                            </dd>
                        </dl>
                        <br>
                        <div><input type="submit" value="上記の内容で計算を投入" /></div><br>
                    </form>

若干手間ですが、アップロードするファイルの path を入力するようにしてあります。

input type=”file” で選択したファイルの path を取得しようとすると別名で一時保存されたファイルの path が取られてしまいます。また、このままアップロードすると、別名のファイルがアップロードされてしまうので、計算機での job 投入コマンドで困ってしまいます。そのため、local_path を入力してもらっています。

続いて、POST メソッドで得た値をチェックし、OK ならば $_SESSION[‘submit’] メソッドに入れ、submit_check.php に遷移するようにします。

リモートログイン

submit_check.php で job の投入を行います。

第二回目の記事でもお話ししたように計算機へのログインには、ssh2_connectssh2_exec を使います。

上でダウンロードしたファイルの中の admin/submit_check.php というファイルを参照してください。

                        $filename = $_SESSION['submit']['filename'];
                        $local_path = $_SESSION['submit']['local_path'];
                        $remote_path = $_SESSION['submit']['remote_path'];
                        $machine_name = $_SESSION['submit']['machine'];
                        $content = $_SESSION['submit']['content'];
                        $calculation = $_SESSION['submit']['calculation'];

                        if( $content == ""){
                            $content = "至急、計算内容を書き込んでください。";
                        }

                        if( $calculation == ""){
                            $calculation = "not selected";
                        }

                        print("filename: " . $filename . "<br>");
                        print("local_path: " . $local_path . "<br>");
                        print("remote_path: " . $remote_path . "<br>");
                        print("machine_name: " . $machine_name . "<br>");
                        print("content: " . $content . "<br>");
                        print("calculation: " . $calculation . "<br>");
                        echo "変数の設定 OK";
                        
                        $job_number = job_submit($filename, $local_path, $remote_path, $machine_name);
                        echo $job_number . " を submit しました。";

リモートログインした際の注意ですが、各計算機で設定してある alias は基本的には使用不能です。.bashrc を読み込む必要があります。

ジョブ・スケジューラーを利用して job を投入するときには sh ファイルを作成し、それを qsub などのコマンドで投入する必要があります。

管理人は、script フォルダ内に、input ファイルの内容を読み取り sh ファイルを作成し jobsubmit までしてくれるという自作のプログラムを用意しています。さらに aliaskmkm と入力すれば呼び出せるように設定してありますが、php からのリモートログインではこのようなことはできません。

ssh2_exec でコマンドを実行する際には、alias を使わずにフルパスでスクリプトを呼び出す必要があります。例えば、”/script/kmkm input.com“のように。

また、ファイルのアップロードには、ssh2_scp_send という関数を使います。include/job_submit.php の中身を参照してください。

ノートを作成

前回の記事でも説明したように、INSERT コマンドを使って MySQL に登録します。

$query = $pdo->prepare('INSERT INTO report(title, content, calculation, machine, directory, job_number) VALUES (?, ?, ?, ?, ?, ?)');
                        $query->execute(array(
                            $filename,
                            $content,
                            $calculation,
                            $machine_name,
                            $remote_path,
                            $job_number
                        ));
                        echo "ノートに書き込みました。<br>";

第4回のまとめ

今回の記事では、電子実験ノートから直接 job を投入し、同時にノートの作成も行う方法を解説しました。

一見難しそうに見えますが、全て PHP と MySQL を組み合わせれば簡単に実装できます。

次回は、ログインシステムについてお話しします。

管理人: