我正在构建一个小型网络应用,从另一个网站(基于WordPress的网站)的一行数据库中提供一个网站。
基本上我有三个文件:一个名为outputjson.php
,它将生成一个名为results.json
的JSON文件(存在于我的WordPress网站中),而在另一个网站中,我将为该文件发出一个AJAX请求为了显示广播电台的播音员部分(播放者的照片,社交,时间)。
我的问题是我必须手动启动该过程,但我想自动执行此操作,每次有人更新我的数据库时,我希望我的文件将监听事件并运行PHP脚本。
到目前为止,我的代码是:
outputjson.php
<?php
global $wpdb;
if(!isset($wpdb))
{
require_once('wp-config.php');
require_once('wp-includes/wp-db.php');
}
$result = $wpdb->get_results ( "SELECT * FROM " . $table_prefix . "radio_announcer_on_air" );
$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($result, JSON_UNESCAPED_SLASHES));
fclose($fp);
?>
这将生成如下文件:
results.json
[
{
"announcer_id":"19",
"announcer_time_start":"07:00:00",
"announcer_time_end":"08:59:59",
"announcer_photo":"image.jpg",
"announcer_name":"Name",
"announcer_facebook":"",
"announcer_twitter":"",
"announcer_rss":"",
"announcer_mail":"",
"announcer_weekday":"7"
}
]
我的上一个文件将存在于另一台服务器上并且会产生魔力:
announcers.js
$(function(){
$.ajax({
url: "http://otherwebsite.com/results.json",
type: "GET",
dataType: "JSON",
cache: false,
success: function(markers) {
//Do something
}
有什么建议吗?我甚至可以考虑每天运行这个脚本,例如,每次有人要更改我的数据库行(事件)时运行它听起来非常复杂,至少我知道我到目前为止。
答案 0 :(得分:1)
在浏览器中使用JSON端点的好处在于它不必来自静态文件。
考虑您的results.json
示例。如果这是一个静态文件,那么您的Web服务器(通常是Apache)将检测json
扩展名并发送相应的HTML 5 standards以向浏览器标识其类型。对于JSON,即:
application/json
因此,只要我们在PHP中执行相同操作,JavaScript中的AJAX调用就不会注意到差异。在outputjson.php
中,只需在开头添加:
header('Content-Type: application/json');
这是必要的,因为Web服务器将看到文件扩展名为php
,并且不知道对应的MIME类型(因为PHP脚本可以生成任何类型的文件)。因此,我们必须手动完成。
要将其连接到JavaScript,只需将url
参数指向PHP脚本:
url: "http://otherwebsite.com/outputjson.php",
我在评论中提到可以将文件称为something.json.php
。为了澄清,这种命名方式只是一种约定,实际上并没有使Web服务器自动设置任何标题 - 您仍然必须在PHP脚本中执行此操作。但是,命名使开发人员和站点用户可以非常轻松地查看(在URL栏或文件浏览器中)文件生成的内容类型。
因此,您更新的脚本将是这样的:
<?php
header('Content-Type: application/json');
global $wpdb;
require_once 'wp-config.php';
require_once 'wp-includes/wp-db.php';
$result = $wpdb->get_results(
"SELECT * FROM {$table_prefix}radio_announcer_on_air"
);
echo json_encode($result);
?>
请注意,它不再需要写入文件 - 它应该只将数据输出到浏览器。我删除了JSON_UNESCAPED_SLASHES
,因为我不明白它的目的 - 如果你确定需要它,请把它放回去,但PHP的默认值通常很好。
我也删除了if
语句,因为在加载WP库之前无法设置全局数据库变量。
值得考虑的是AJAX消耗此端点的频率,以及它对数据库的负载程度。如果它包含超过几百行,您可能需要考虑分页,因为处理大量数据的AJAX操作会降低浏览器的速度。
然而,首先让它工作是明智的,然后如果证明有必要,你可以从那里进行优化。