使用php在shell脚本中执行程序

时间:2017-10-16 22:26:59

标签: php bash macos shell unity3d

我正在尝试自动化某些Unity3D进程,以便可以从PHP脚本中调用它。

我已经创建了一个shell脚本,调用一些UNITY命令行来创建项目和执行方法,如果我在终端中使用它,工作正常。 问题是当我将它用于PHP脚本时:   - 我正在使用shell_exec命令来执行我的脚本,并且所有shell方法都有效(ls,mkdir,echo)但是当我调用应用程序时没有任何事情发生。

我正在阅读这是apache的权限问题,但几个小时后我仍然没有找到解决方案。

我在我的mac(Sierra)中安装了一个服务器,启用了apache和PHP 5进行测试。

此致 加布里埃尔

编辑1
我在这里添加我的代码

如果我在终端中执行它,这是我的shell_script

#!/bin/bash

UNITY_EXEC=/Applications/Unity_5.6.1f1/Unity.app/Contents/MacOS/Unity

if [ -z "$2" ]; then echo "You must provide a path to the bundle assets and a path to the resulting bundle."; exit 1; fi

export UNITY_ASSET_BUNDLE_PATH=${2}

CREATION_TIME=`date +%s` 
ASSET_BUNDLE_PROJECT_DIR=/tmp/AssetBundle-${CREATION_TIME}

echo "Creating temporary project."; 
${UNITY_EXEC} -batchmode -quit -createProject ${ASSET_BUNDLE_PROJECT_DIR};

echo "Copying resources from source folder to assets folder.";
cd $1; cp -r . ${ASSET_BUNDLE_PROJECT_DIR}/Assets;

echo "Finding assets."; 
cd ${ASSET_BUNDLE_PROJECT_DIR}; 
ASSETS_TO_BUNDLE=`find Assets -type f -not -name *.meta -not -name .DS_Store -not -name AssetsBundler.cs | sed 's/^.\///g' | sed 's/^/assetPathsList.Add("/g' | sed 's/$/");/g'`

mkdir ${ASSET_BUNDLE_PROJECT_DIR}/Assets/Editor/;
cat << EOT >> ${ASSET_BUNDLE_PROJECT_DIR}/Assets/Editor/AssetsBundler.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

public class AssetsBundler{
    public static void Bundle(){
        List<string> assetPathsList = new List<string>();
        ${ASSETS_TO_BUNDLE}
        ArrayList assetList = new ArrayList();
        foreach(string assetPath in assetPathsList)
        {
            UnityEngine.Object[] assets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
            foreach(UnityEngine.Object asset in assets)
            {
                assetList.Add(asset);
            }
        }
        UnityEngine.Object[] allAssets = (UnityEngine.Object[]) assetList.ToArray(typeof(UnityEngine.Object));

        BuildPipeline.BuildAssetBundle(allAssets[0], allAssets, "${UNITY_ASSET_BUNDLE_PATH}", BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);
    }
}

EOT

echo "Building the bundle."; 
${UNITY_EXEC} -batchmode -quit -projectProject ${ASSET_BUNDLE_PROJECT_DIR} -executeMethod AssetsBundler.Bundle;

这是我的PHP_script

<?php

$old_path = getcwd();
chdir('./AssetBundleBuilder/');
$output = shell_exec('./AssetBundleBuilder ./Bundlify ./result.unity3d');
chdir($old_path);

echo $output;

?>

如果我从firefox执行我的PHP脚本,我会收到所有echo消息作为输出,以便告诉我该脚本正在运行。问题是UNITY呼叫不起作用。

1 个答案:

答案 0 :(得分:0)

我会回应自己。

最后我得到了一个使用套接字的解决方案。我在python中创建了一个服务器套接字,在每个连接中调用bash脚本,我的客户端套接字在php中,这是我从浏览器调用的文件。

谢谢! 加布里埃尔