如何(本地)从PHP调用JavaScript函数(在Raspberry Pi上)

如何(本地)从PHP调用JavaScript函数(在Raspberry Pi上),javascript,php,Javascript,Php,我陷入了一个小小的困境,我真的不知道如何继续。 我有一个设置,我在本地托管一个网站,在一个树莓Pi上,用来向LED甜甜圈+扬声器发送命令。该网站还包含一个调度程序,允许人们将音乐播放列表和licht场景拖放到某个日期和时间。其概念是,这些将自动发射 这个网站上的界面有几个我们可以调用的功能。重点是,我正在使用PHP脚本,例如从MySQL数据库中获取信息,并使用该信息(日期+时间+licht场景/音频文件字符串)发送到LED甜甜圈和扬声器 我这里的问题是,我搜索过,人们告诉我PHP不能访问JS函数

我陷入了一个小小的困境,我真的不知道如何继续。 我有一个设置,我在本地托管一个网站,在一个树莓Pi上,用来向LED甜甜圈+扬声器发送命令。该网站还包含一个调度程序,允许人们将音乐播放列表和licht场景拖放到某个日期和时间。其概念是,这些将自动发射

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

我这里的问题是,我搜索过,人们告诉我PHP不能访问JS函数,仅仅是因为它们是服务器端还是客户端,或者必须在一个文件中

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

我将向您展示一些片段:

我想调用的函数:(URL\u地址不是很有用,与startmodulo一样。它可以在以后应用。)

我只是做了一个临时测试——显然不起作用,但可能会告诉你我在想什么:

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

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

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

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

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

开始脚本:

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);
    } }); }
以及:

然后在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 );
?>
//查找即将启动的songinfo

通过这种方式,您可以每500毫秒调用一次搜索songinfo和lighting内容的位,如果找到一些,则返回数据。当脚本找到一些数据时,它会使用适当的变量调用sendStartSceneAjax。也许您可以使用其中的一些变量。

虽然php无法调用js函数,但由于您已经知道的原因,这个特定的js块是一个ajax http请求,可能会以某种方式重写为php代码。也许甚至可以跳过http部分,并通过shell从php直接执行请求中调用的cgi bin脚本。也许您可以重新构造一点,并在调用dat的php脚本中使用调用php scipt的setinterval函数开始整个过程获取歌曲数据和灯光信息,回显对javascript的调用,然后启动脚本。我将向ClarifyThank Calimero,Wolfeh发布一个答案。这两条评论都有非常合理的观点,我将开始对此进行研究和测试。我很确定,你正在使你的项目变得比应该的更复杂。很可能你看起来ng为你的问题提供了错误的解决方案!分享为什么和如何使用PHP运行这个JS,以及你希望你的设备做什么,我们可以告诉你whitch是最好的方法。感谢你的回答。问题是,它都在一个raspberry pi上运行,所以Websockets在我看来可能有点过火了。此外,没有真正的服务器在运行。我们在调制解调器上重新使用DNSMASQ将URL链接到pi上的网站。@Sandervandent浏览器规则是浏览器规则……即使在同一台机器上本地运行服务器,浏览器仍将服务器端代码视为完全独立的机器上的代码。除了AJAX长轮询或WebSocket之外,无法发送sig从服务器端到客户端的nal。
 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 );
//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 );
?>