質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

634閲覧

ruby で require を通すと puts できない

Dakoit

総合スコア19

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2020/01/09 15:30

編集2020/01/09 16:35

###前提・目的
WordPressを使い、PHP で ruby のプログラムを require を通して呼び出したいです。

以下「header.php」のコードが前提となります。
( exec を使っていますが上記が実現できればこだわりはありません。)

「header.php」

<?php $rb_url = get_template_directory() . '/rb/hello.rb'; $fullPath = '/usr/bin/ruby '.$rb_url; if(!exec($fullPath, $output, $return_status)){ echo '読み込み失敗'; }else{ echo '成功'; var_dump($output); }

###問題
パターン1なら「hello」が var_dump できますが、パターン2のように require を通すとできません。

###パターン1
上記「header.php」と下記「hello.rb」なら、「hello」が var_dump でき問題ありません。

「hello.rb」

ruby

1puts "hello"

###パターン2
しかし下記のように require を通すと「読み込み失敗」が出力されてしまうのが問題です。

「hello.rb」

ruby

1require 'hello2'

「hello2.rb」

ruby

1puts "hello"

###問題の考察と試行
ディレクトリが以下なので、require する場合は「./」が必要という情報を得ました。

wp-content ├ themes └ my-theme-name ├ header.php ├ rb ├ hello.rb └ hello2.rb

そこでパターン2の「hello.rb」を下記のように「./」としたのですが、やはり「hello2.rb」は呼ばれず「読み込み失敗」でした。

「hello.rb」

ruby

1require './hello2'

その後、次のように require_relative を使うと「hello」が var_dump できました。

「hello.rb」

ruby

1require_relative 'hello2'

でも、どうしてでしょうか?ディレクトリは上記の通りのはずですが、どうして require ではできず、require_relative ではできるのか…、

お分かりになる方はいらっしゃいますでしょうか。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「カレントディレクトリ」という概念を学んでください。知らないと今後いろいろつまずきます。

require 'hello2'は、ライブラリにあるhello2.rbを読もうとします。
(具体的には、p $LOAD_PATHで表示されるディレクトリを見ます)

require './hello2'はカレントディレクトにあるhello2.rbを読もうとします。

hello.rbから、同一ディレクトリにあるhello2.rbを読みたいのなら、元のスクリプトファイルからの相対パスで読めるrequire_relativeを使います。

Ruby

1require_relative 'hello2'

他にも、
・フルパスでrequireする
hello2.rbのあるディレクトリをカレントディレクトリにしてrequire './hello2'する
という方法もありますが、上記が簡単です。

投稿2020/01/09 16:34

otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dakoit

2020/01/09 16:49 編集

ありがとうございます。入れ違いで質問を編集しまして、ちょうど仰る「require_relative」でできました。また、他の方法のご提示もありがとうございます。 ですがなぜパターン2でできないのか… 「カレントディレクトリ」への理解が浅く、もう少し教えて頂きたく存じます。 どのように「カレントディレクトリ」は決定されるのでしょうか。require を実行したディレクトリ(つまりパターン2で require を実行したディレクトリである「rb」)がそれだという所感でおりまして、なのでその「rb」から「require 'hello2'」とすれば「hello2.rb」が呼べるという予想でございました。 が、違うわけですよね。どのように「カレントディレクトリ」は決定されるのでしょうか? あと、ライブラリというのは今回の件でいうと何を指しますか?
otn

2020/01/09 17:16

カレントディレクトリは、プロセス生成時には親プロセスのカレントディレクトリを引き継ぎます。 その後、必要に応じてプロセス内で変更します。変更していない限り親と同じです。 プログラムファイルがどこにあるかは無関係です。 PHPファイルがApacheなどから直接呼び出された場合は、そのファイルのあるディレクトリをそのプロセスのカレントディレクトリにしてからPHPファイルを起動しているようです。その後はchdir関数を呼び出さない限りはずっとそのままです。 PHPからRubyプロセスを起動してもカレントディレクトリはRubyプロセス内で変更しない限りそのまま(PHPファイルのあるディレクトリ)です。 > あと、ライブラリというのは今回の件でいうと何を指しますか? 回答に書いたのですが。。。。
Dakoit

2020/01/09 17:36

>カレントディレクトリは、プロセス生成時には親プロセスのカレントディレクトリを引き継ぎます。 そういう仕組みでしたか。ありがとうございます。では以下➀➁は何が間違っているのでしょうか? ➀結局パターン2について「hello.rb」で require したときのカレントディレクトリは「py」ということですよね? ➁であれば、「hello.rb」で「require 'hello2'」とすると、「rbの中のhello2.rbを読んでください」という意味ですよね? このように考えてしまうため、パターン2が動作しないことが理解できないです。 上記➀➁の考えはどこが間違っているのでしょうか?もしよろしければ、わたしの考え方に沿って以下2つの【正解】を埋めていただけませんでしょうか…申し訳ございません………・ ➀結局パターン2について「hello.rb」で require したときのカレントディレクトリは【正解➀】ということである。 ➁であれば、「hello.rb」で「require 'hello2'」とすると、【正解➁】という意味である。
otn

2020/01/10 00:22 編集

正解1: 私がWordPressの中身をよく知らないので、不明。 多分index.phpのある場所。 > PHPファイルがApacheなどから直接呼び出された場合は、そのファイルのあるディレクトリをそのプロセスのカレントディレクトリにしてからPHPファイルを起動しているようです。 と書いたとおりで、Wordpressで最初に読まれるファイル(よく知りませんが index.phpとか?)が起動された直後であれば、カレントディレクトリはそのindex.phpファイルがあるディレクトリです。それ以降はそのプロセスの処理の間は、requireとかしたとしてもカレントディレクトリはchdir関数で変更しない限りそのままです。 正解② index.php起動以降、chdir関数が一度も実行されていないのなら、index.phpと同じ階層のhello2.rbを読もうとするし、chdir関数が実行されたのなら最後に実行されたときの引数ディレクトリにあるhello2.rbを読もうとする。
Dakoit

2020/01/11 11:06

requireが実行されたファイルのあるディレクトリではなく、最初のファイルのあるディレクトリなんですね。WordPressの場合index.phpなので、カレントディレクトリはそれが入ったディレクトリだと。なるほど。パターン2が通用しない理由が納得できました。どうもありがとうございました。
otn

2020/01/11 11:13

> 最初のファイルのあるディレクトリなんですね。 あくまで「Apach等HTTPサーバーから起動された場合は」ですね。
Dakoit

2020/01/11 11:15

な、なるほど…。ややこしそうです。カレントディレクトリ、ここから先要注意したいと思います。
otn

2020/01/11 11:19

シェルのコマンドラインからプログラムを起動した場合は、そのプログラムプロセスのカレントディレクトリの初期値は、その時点のシェルのカレントディレクトリのままです。
Dakoit

2020/01/11 11:20

そんな(泣)ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問