【问题标题】:How to (locally) call a JavaScript function from PHP (on Raspberry Pi)如何(本地)从 PHP(在 Raspberry Pi 上)调用 JavaScript 函数
【发布时间】:2015-11-27 14:10:10
【问题描述】:

我处于一个轻微的困境中,我无法真正理解如何进行。 我有一个设置,我在本地托管一个网站,在一个用于向 LED 甜甜圈 + 扬声器发送命令的 Raspberry Pi 上。该网站还包含一个调度程序,允许人们将音乐播放列表和灯光场景拖放到日期和时间。这个概念是这些将被自动触发。

这个网站的界面有几个我们可以调用的功能。关键是,我正在使用Cronjobs 触发 PHP 脚本,例如从我的 MySQL 数据库中获取信息并使用该信息(日期+时间+licht-scene / 音频文件的字符串)发送到 LED -甜甜圈和扬声器。

我的问题是everywhere我已经搜索过,人们告诉我PHP无法访问JS函数,仅仅是因为它们是服务器端与客户端,或者它必须在一个文件中。

但是,所有这些脚本等都是在 Raspberry Pi 上本地运行的,我正在处理预先存在的代码。

我会给你看一些sn-ps:

一个我想调用的函数:(URL_address不是很有用,和startmodulo一样,后面可以应用。)

function sendStartSceneAjax(URL_address, filename, startmodulo){
$.ajax({
    type: "POST",
    dataType: "json",
    url: "/cgi-bin/scene?"+Math.random(), //"/cgi-bin/scene?"
    data: {file: filename, startdelaymodulo:startmodulo },
    success: function (data) {
        updateScene(data);
        console.log(data);
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        document.getElementById("sceneplay").innerHTML = "error playing: " + filename;
        console.error("OH SHIT STARTSCENEAJAX " + errorThrown + " " + XMLHttpRequest + URL_address + filename + startmodulo);
    } }); }

只是我构建的一个临时测试——显然不起作用,但可能会告诉你我的想法:

if($split_sentence_2 == $nowDate)
{
        ?>
        <button name="Play" onclick="startSelectedSceneFromDB('Blauwe_Pulse.csv');" class="play" title="<? echo $label_play; ?>"></button>
        <?   
}

我真的希望你们至少能给我一些关于如何进行的指示。将不胜感激!

附言我想发布更多链接以表明我一直在做研究,但目前我只允许 2 个。抱歉!

【问题讨论】:

  • 虽然由于你已经知道的原因 php 无法调用 js 函数,但这个特定的 js 块是一个 ajax http 请求,它可能会以某种方式被重写为 php 代码。也许甚至可以跳过 http 部分,并且您在请求中调用的 cgi-bin 脚本直接从 php 通过 shell 执行。
  • 也许你可以稍微重构一下,用一个调用 php scipt 的 setinterval 函数开始整个事情,在 php 脚本中你调用日期并获取歌曲数据和照明信息,然后回显一个调用到 javascript 然后触发脚本我会发布一个答案来澄清
  • 感谢 Calimero,Wolfeh -- 两个 cmets 都有非常合理的观点,我将开始研究和测试一下。
  • 我很确定,你正在让你的项目比应该的更复杂。很可能您正在为您的问题寻找错误的解决方案!分享这个 JS 应该由 PHP 运行的原因和方式,以及你希望你的设备做什么,我们可以告诉你 whitch 是最好的方法。

标签: javascript php


【解决方案1】:

启动脚本:

function sendStartSceneAjax(URL_address, filename, startmodulo){
$.ajax({
    type: "POST",
    dataType: "json",
    url: "/cgi-bin/scene?"+Math.random(), //"/cgi-bin/scene?"
    data: {file: filename, startdelaymodulo:startmodulo },
    success: function (data) {
        updateScene(data);
        console.log(data);
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        document.getElementById("sceneplay").innerHTML = "error playing: " + filename;
        console.error("OH SHIT STARTSCENEAJAX " + errorThrown + " " + XMLHttpRequest + URL_address + filename + startmodulo);
    } }); }

还有:

 setInterval( function( e ) {
            $.post( '/to_php_script_to_get_song_info.php', function( returnData ) {
                    if ( returnData != '' ) {
                        returnData = JSON && JSON.parse(json) || $.parseJSON(json);
                        sendStartSceneAjax( returnData.URL_address, returnData.filename, returnData.startmodulo );
                    }
                });
        }, 500 );

然后在php部分:

//find whatever songinfo is about to start
<?php
    $data = array(
        'URL_address' => $found_url_address,
        'filename' => $found_filename,
        'startmodulo' => $found_startmodulo,
);

echo json_encode( $data );
?>

这样,您每 500 毫秒调用一次搜索歌曲信息和照明内容的位,并在找到时返回数据。当脚本找到一些时,它会使用适当的变量调用 sendStartSceneAjax。也许你可以使用一些。

【讨论】:

    【解决方案2】:

    使用标准 AJAX 无法实现您的要求。客户端可以向服务器请求任何内容,但服务器不能直接与客户端通信。以前的解决方案是快速轮询或长轮询,它们开始被我建议您研究的技术 WebSockets 所取代。

    互联网上有大量关于 WebSockets 的信息,一些谷歌搜索应该会让你走上正确的道路,但基础是 WebSockets 将允许服务器和客户端之间近乎真实的双向直接通信 -时间。然后,这将允许您的服务器告诉客户端做某事,本质上允许您的服务器在浏览器中调用 javascript。

    更新:重新阅读您的应用程序后,我意识到您可能在谈论一个稍微不同的场景,其中网络套接字仍然可以工作,但如果您实际上不需要网页根本,只是希望这是一个自动化的后台任务,那么也许将所有代码移动到服务器端就是您所需要的。但是,如果您确实需要一个网页来驱动所有这些,那么 WebSockets 将是您的最佳选择。

    那里有很多实现,我建议您自己研究以找到最适合您的实现,但我之前使用的是autobahn.js,它遵循 WAMP(Web 应用程序消息传递协议) ) 规格。应该有一个 PHP WAMP 兼容的实现可以用于服务器。

    【讨论】:

    • 感谢您的回复。问题是,它都在一个树莓派上运行,所以 Websockets 可能有点矫枉过正。此外,实际上并没有运行服务器。我们在调制解调器上使用 DNSMASQ 将 URL 链接到我们在 pi 上的网站。
    • @SanderVanDenHout 浏览器规则就是浏览器规则......即使在同一台机器上本地运行服务器,浏览器仍然将服务器端代码视为在完全独立的机器上一样。除了 AJAX 长轮询或 WebSockets,没有办法从服务器端向客户端发送信号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多