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

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

ただいまの
回答率

90.76%

  • Python

    6920questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Apache

    1720questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • MAMP

    197questions

    Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

MAMPのapacheのTimeoutを伸ばす

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 354

SoraSue

score 24

前提・実現したいこと

mampのローカル開発環境でpythonをcgiとして実行しているのですが、タイムアウトしてしまいます。そのため、mampのapacheのタイムアウトを伸ばしたいです。

発生している問題・エラーメッセージ

pythonをcgiとして実行させると、apacheのエラーログに次のようなエラーが出ます。

 [error] [client ::1] (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed

該当のソースコード

以下のコードを実行させました。内容は、「chrome拡張機能としてユーザーが訪れたページの本文を取得→それをmecabで形態素解析→mysqlにURLと単語をそれぞれ保存→mysqlから過去のデータを取得してtf-idf(その単語の重要度)を単語ごとに計算」というものです。Lifehackerなどではタイムアウトしませんでしたが、wikipediaなど少し長いサイトになるとタイムアウトします。

#!/Users/僕のユーザー名/.pyenv/versions/anaconda3-4.4.0/bin/python
# -*- coding: utf-8 -*-

import sys,io,codecs

print("Content-Type: text/html; charset=UTF-8")
print()

sys.stdin =  open('/dev/stdin',  'r', encoding='UTF-8')
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

import cgi
import cgitb; cgitb.enable()
import json
from readability.readability import Document
import urllib.request
import html2text
import MeCab
import mysql.connector
import re
import math
import socket
socket.setdefaulttimeout(1800)
print(str(socket.getdefaulttimeout()))

def save(url,word):
    config = {
      'user': 'root',
      'password': 'root',
      'unix_socket': '/Applications/MAMP/tmp/mysql/mysql.sock',
      'database': 'hoge',
      'raise_on_warnings': True,
    }
    link = mysql.connector.connect(**config)
    cursor = link.cursor()

    cursor.execute('''insert into horizon (url,text) values (%s,%s)''', [url,word])
    link.commit()

def tf_idf(url,words):
    all_words_in_this_site = len(words)
    config = {
      'user': 'root',
      'password': 'root',
      'unix_socket': '/Applications/MAMP/tmp/mysql/mysql.sock',
      'database': 'hoge',
      'raise_on_warnings': True,
      'connection_timeout': 1800
    }
    link = mysql.connector.connect(**config)
    cursor = link.cursor(buffered=True)

    cursor.execute('select max(id) from horizon')
    all_texts = cursor.fetchone()[0]
    print(type(all_texts))
    print(all_texts)
    for word in words:
        word_in_this_site = 0
        if word in words:
            word_in_this_site = word_in_this_site + 1
        else:
            word_in_this_site = word_in_this_site
        tf = word_in_this_site/all_words_in_this_site
        cursor.execute('select url from horizon where text = %s',(word,))
        texts_with_word = cursor.rowcount
        idf = math.log(all_texts/texts_with_word)+1
        tf_idf = tf * idf
        print(word)
        print(tf_idf)
    link.commit()

def cut_text(text):
    text = text.strip("")
    text = text.replace("http","")
    text = text.replace("/","")
    text = text.replace("[","")
    text = text.replace("]","")
    text = text.replace("%","")
    text = text.replace(" ","")
    text = text.replace("{","")
    text = text.replace("}","")
    text = text.replace("%","")
    text = text.replace(":","")
    text = text.replace("#","")
    text = text.replace("*","")
    text = text.replace("\n","")
    text = text.replace("|","")
    text = text.replace("-","")
    text = text.replace(".","")
    text = text.replace("?","")
    text = text.replace("(","")
    text = text.replace(")","")
    text = text.replace("<","")
    text = text.replace(">","")
    text = text.replace("¥¥","")
    text = text.replace("¥n","")
    text = text.replace("1","")
    text = text.replace("2","")
    text = text.replace("3","")
    text = text.replace("4","")
    text = text.replace("5","")
    text = text.replace("6","")
    text = text.replace("7","")
    text = text.replace("8","")
    text = text.replace("9","")
    text = text.replace("0","")
    text = text.replace("@","")

    text = text.replace("\◆","")
    text = text.replace("◆","")
    text = text.replace("\0","")
    text = text.replace("\a","")
    text = text.replace("\b","")
    text = text.replace("\t","")
    text = text.replace("\n","")
    text = text.replace("\v","")
    text = text.replace("\f","")
    text = text.replace("\r","")
    text = text.replace("\e","")
    text = re.sub(r'[\x00-\x1f\x7f]+', '', text)

form = cgi.FieldStorage()
for key in form.keys():
    url = form.getvalue(key)
    html = urllib.request.urlopen(url)
    s = html.read()

    article = Document(s).summary()
    article = article.encode("utf-8")
    article = article.decode("utf-8")

    text = html2text.html2text(article)
    cut_text(text)
    tagger = MeCab.Tagger('-d ./mecab-ipadic-neologd')
    tagger.parse('')
    node = tagger.parseToNode(text)
    words = []
    while node:
        surface = node.surface
        words.append(surface)
        node = node.next
    for word in words:
        save(url,word)

    tf_idf(url,words)

試したこと

上のコードにもあるように、socket.setdefaulttimeout(1800)や'connection_timeout': 1800でタイムアウトを伸ばそうとしてみました。しかし、実行してもすぐにタイムアウトしたので、mampのapacheのtimeoutについての設定に原因があるのだと思います。これを変えるために、httpd.confを見てみましたが、timeoutについての記述が見つかりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

開発環境は以下の通りです。

  • macOS Sierra
  • python3
  • MAMP バージョン4.2
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

/Applications/MAMP/conf/apache/extra/httpd-default.conf

上記ファイルに TimeOut の設定が記載されているのではないかと思います。
該当箇所があれば、TimeOut ディレクティブに変更したい秒数を指定します。
設定の詳細は下記のドキュメントを参照してください。

https://httpd.apache.org/docs/2.2/ja/mod/core.html#timeout

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/21 19:51

    変更できました!教えていただきありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6920questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Apache

    1720questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • MAMP

    197questions

    Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト