繁体   English   中英

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

[英]How to (locally) call a JavaScript function from PHP (on Raspberry Pi)

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

本网站的界面有几个我们可以调用的功能。 关键是,我正在使用Cronjobs来启动PHP脚本,例如从我的MySQL数据库中获取信息并使用该信息(日期+时间+ licht-scene / audio文件的字符串)发送到LED-donut和发言者。

我的问题在于, 无论哪里搜索,人们都告诉我PHP无法访问JS功能,仅仅因为它们是服务器端与客户端,或者它必须在一个文件中。

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

我会告诉你一些片段:

我想调用的函数:(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>
        <?   
}

我真的希望你们和gals至少可以给我一些关于如何进行的指示。 非常感谢!

ps我想发布更多链接来表明我一直在做研究,但我现在只允许2。 我很抱歉!

您使用标准AJAX无法提出要求。 客户端可以从服务器请求任何内容,但服务器无法直接与客户端通信。 以前的解决方案是快速轮询或长轮询,这些都开始被我建议您调查的技术WebSockets取代。

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

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

有很多实现,我建议你自己做研究找到最适合你的那个,但我以前用过的那个是遵循WAMP(Web应用程序消息传递协议)规范的autobahn.js 在某个地方应该有一个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);
    } }); }

和:

 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毫秒调用一次搜索songinfo和照明内容的位,如果找到则返回数据。 当脚本找到一些时,它会使用适当的变量调用sendStartSceneAjax。 也许你可以使用其中一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM