1

オプションに使用される文字列に制限はありますか?トランジェントAPIを使用するのに疲れています。トランジェント名にURLの文字列を含めると、データが保存されません。文字の長さによるものなのか、違法な文字によるものなのかわかりません。

$url = 'http://stackoverflow.com/questions/tagged/php+wordpress+wordpress-plugin';
$strTransient = 'sample_transient_' . $url;
$key = 'sample_transient';
$html = get_transient($strTransient);   
if( false === $html ) {
    echo 'cache is not used: ' . $strTransient . '<br />';      
    $html = wp_remote_get($url);    
    $html = $html['body'];  
    $savehtml = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $html, MCRYPT_MODE_CBC, md5(md5($key))));
    set_transient($strTransient, $savehtml, 60 );
} else {
    echo 'cache is used. <br />';
    $html = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($html), MCRYPT_MODE_CBC, md5(md5($key)));  
}
print_r($html);

前もって感謝します。

[編集]

文字の長さによるものと思われます。

$transientkey = 'verylongstring_verylongstring_verylongstring_verylongstring_verylongstring_verylongstring_verylongstring'; // <-- fails
// $transientkey = 'shortstring';   // <-- okay

$data = get_transient($transientkey);   
if( false === $data ) {
    echo 'transient is not saved: ' . $transientkey . '<br />';     
    $data = 'hello world!';
    echo 'now saving the data.<br />';
    set_transient($transientkey, $data, 60 );
} else {
    echo 'transient is used. <br />';
}
print_r($data);

では、オプションキーの制限に関する正確な情報はどこにありますか?コアに見つかりませんでした。これはのコメントですset_transient()

wp-includes / option.php

/**
 * Set/update the value of a transient.
 *
 * You do not need to serialize values. If the value needs to be serialized, then
 * it will be serialized before it is set.
 *
 * @since 2.8.0
 * @package WordPress
 * @subpackage Transient
 *
 * @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the
 *  transient value to be stored.
 * @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success.
 *
 * @param string $transient Transient name. Expected to not be SQL-escaped.
 * @param mixed $value Transient value. Expected to not be SQL-escaped.
 * @param int $expiration Time until expiration in seconds, default 0
 * @return bool False if value was not set and true if value was set.
 */

また、URLを一時的なキーとして識別するための提案はありますか?

4

1 に答える 1

3

ドキュメントによると、一時的な名前は「SQLエスケープされていないことが期待されます。長さは 45 文字以下である必要があります。

Wordpress 3.4.1 のテーブル構造を見ると、次のようになります。

mysql> desc wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(64)         | NO   | UNI |         |                |
| option_value | longtext            | NO   |     | NULL    |                |
| autoload     | varchar(20)         | NO   |     | yes     |                |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

そのため、option_nameは 64 文字を超えることはできませんが、 2 32バイト (~4GB) まで data大きくすることができます。最終的には、64 文字までのオプション名を持つことができる呼び出しですが、transient は特別な方法で動作するため、使用する必要がある最長の値は です。set_transientadd/update_option45

編集:

WPコードを見ると、参照ガイドごとに一時的な名前が45文字に制限されている理由は、コードがこれを行うためです:

$transient_timeout = '_transient_timeout_' . $transient;
//...
add_option( $transient_timeout, time() + $expiration, '', 'no' );

したがってhello、トランジェントとして渡すと、というオプションが追加されます_transient_timeout_hello。と仮定する45 + strlen('_transient_timeout_') === 64と、WP オプション テーブルのオプション名フィールドの varchar の最大長は 64 です。

于 2012-09-14T00:41:01.933 に答える