主頁 > 軟體工程 > 無法使用TwitterAPI、PHP和curl發布影像和文本?媒體/上傳和狀態/更新

無法使用TwitterAPI、PHP和curl發布影像和文本?媒體/上傳和狀態/更新

2021-10-22 23:23:19 軟體工程

我可以得到一個 image_id 但不能用影像更新狀態......

我向“media/upload.json”發出第一個請求并獲得media_id,然后我向“statuses/update.json”發出請求,其中包含之前收到的狀態訊息和media_id。只顯示文本,不顯示影像。

我的 php 代碼:

<?php
$oauth_access_token = "XXXX";
$oauth_access_token_secret = "XXXX";
$consumer_key = "XXXX";
$consumer_secret = "XXXX";

//twitter api urls
$URLS = array(
    "image" => "https://upload.twitter.com/1.1/media/upload.json",
    "status" => "https://api.twitter.com/1.1/statuses/update.json"
);

function buildBaseString($baseURI, $method, $params)
{
    $r = array();
    ksort($params);
    foreach ($params as $key => $value) {
        $r[] = "$key=" . rawurlencode($value);
    }
    return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth)
{
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach ($oauth as $key => $value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";
    $r .= implode(', ', $values);
    return $r;
}

function makeRequest($postfields, $url)
{
    global $consumer_key;
    global $consumer_secret;
    global $oauth_access_token;
    global $oauth_access_token_secret;
    $oauth = array(
        'oauth_consumer_key' => $consumer_key,
        'oauth_nonce' => time(),
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_token' => $oauth_access_token,
        'oauth_timestamp' => time(),
        'oauth_version' => '1.0'
    );
    $base_info = buildBaseString($url, 'POST', $oauth);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;
    $header = array(buildAuthorizationHeader($oauth), 'Content-Type: multipart/form-data;');
    $options = array(
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_POSTFIELDS => $postfields,
        CURLOPT_HEADER => false,
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false
    );
    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);
    return $json;
}


//Upload image to twitter and get media_id
$file = file_get_contents("C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\img\mercedes.jpg");
$postfields = array("media_data" => base64_encode($file));
$result = makeRequest($postfields, $URLS['image']);
$imageresult = json_decode($result);
$imageid = $imageresult->media_id_string;
var_dump($imageresult);

// update status with status and media_id
$postfields = array(
    "media_ids" => $imageid,
    "status" => "test messsage with image"
);
var_dump($postfields);
$result = makeRequest($postfields, $URLS['status']);
$statusresult = json_decode($result);
var_dump($statusresult);

twitter api 回應:我在第一個請求的回應中有 media_id。使用 media_id 但在更新狀態時不起作用...

C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:82:
object(stdClass)[1]
  public 'media_id' => int 1446017066218164228
  public 'media_id_string' => string '1446017066218164228' (length=19)
  public 'size' => int 161329
  public 'expires_after_secs' => int 86400
  public 'image' => 
    object(stdClass)[2]
      public 'image_type' => string 'image/jpeg' (length=10)
      public 'w' => int 1200
      public 'h' => int 900
C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:91:
array (size=2)
  'media_ids' => string '1446017066218164228' (length=19)
  'status' => string 'test messsage with image' (length=24)
C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:96:
object(stdClass)[3]
  public 'created_at' => string 'Thu Oct 07 07:38:29  0000 2021' (length=30)
  public 'id' => int 1446017068470611973
  public 'id_str' => string '1446017068470611973' (length=19)
  public 'text' => string 'test messsage with image' (length=24)
  public 'truncated' => boolean false
  public 'entities' => 
    object(stdClass)[4]
      public 'hashtags' => 
        array (size=0)
          empty
      public 'symbols' => 
        array (size=0)
          empty
      public 'user_mentions' => 
        array (size=0)
          empty
      public 'urls' => 
        array (size=0)
          empty
  public 'source' => string '<a href="XXXX" rel="nofollow">XXXX</a>' (length=83)
  public 'in_reply_to_status_id' => null
  public 'in_reply_to_status_id_str' => null
  public 'in_reply_to_user_id' => null
  public 'in_reply_to_user_id_str' => null
  public 'in_reply_to_screen_name' => null
  public 'user' => 
    object(stdClass)[5]
      public 'id' => int XXXX
      public 'id_str' => string 'XXXX' (length=19)
      public 'name' => string 'XXXX' (length=23)
      public 'screen_name' => string 'XXXX' (length=6)
      public 'location' => string 'XXXX' (length=19)
      public 'description' => string 'XXXX' (length=59)
      public 'url' => null
      public 'entities' => 
        object(stdClass)[7]
          public 'description' => 
            object(stdClass)[6]
              ...
      public 'protected' => boolean false
      public 'followers_count' => int 54
      public 'friends_count' => int 47
      public 'listed_count' => int 0
      public 'created_at' => string 'Sun Jan 20 11:36:11  0000 2019' (length=30)
      public 'favourites_count' => int 2163
      public 'utc_offset' => null
      public 'time_zone' => null
      public 'geo_enabled' => boolean false
      public 'verified' => boolean false
      public 'statuses_count' => int 172
      public 'lang' => null
      public 'contributors_enabled' => boolean false
      public 'is_translator' => boolean false
      public 'is_translation_enabled' => boolean false
      public 'profile_background_color' => string 'F5F8FA' (length=6)
      public 'profile_background_image_url' => null
      public 'profile_background_image_url_https' => null
      public 'profile_background_tile' => boolean false
      public 'profile_image_url' => string 'XXXX' (length=75)
      public 'profile_image_url_https' => string 'XXXX' (length=76)
      public 'profile_banner_url' => string 'XXXX' (length=68)
      public 'profile_link_color' => string '1DA1F2' (length=6)
      public 'profile_sidebar_border_color' => string 'C0DEED' (length=6)
      public 'profile_sidebar_fill_color' => string 'DDEEF6' (length=6)
      public 'profile_text_color' => string '333333' (length=6)
      public 'profile_use_background_image' => boolean true
      public 'has_extended_profile' => boolean true
      public 'default_profile' => boolean true
      public 'default_profile_image' => boolean false
      public 'following' => boolean false
      public 'follow_request_sent' => boolean false
      public 'notifications' => boolean false
      public 'translator_type' => string 'none' (length=4)
      public 'withheld_in_countries' => 
        array (size=0)
          empty
  public 'geo' => null
  public 'coordinates' => null
  public 'place' => null
  public 'contributors' => null
  public 'is_quote_status' => boolean false
  public 'retweet_count' => int 0
  public 'favorite_count' => int 0
  public 'favorited' => boolean false
  public 'retweeted' => boolean false
  public 'lang' => string 'en' (length=2)

uj5u.com熱心網友回復:

我遇到了完全相同的問題。在幾乎放棄了幾次之后,我終于破解了它。

您需要知道/做的一些事情。

  1. 確保將您的帖子引數附加到您傳遞給 buildBaseString 的 OAuth 陣列上,然后在 URL 編碼它們之前執行 ksort

  2. 如果您將 post 引數作為陣列傳遞給 curl,那么它會將內容型別標頭更改為您不想要的 multipart/form-data,因此請務必先執行以下操作:$post = http_build_query($data, "", "&"); 在傳遞給 curl 之前。

  3. OAuth 規范規定,當且僅當編碼為 x-www-form-urlencoded 時,主體應包含在基本字串中以進行簽名。

  4. 至于為什么 Twitter 接受所有 bar media_ids 引數,如果你作為 multipart/form-data 發送,我不知道,但似乎就是這種情況。

  5. 不要將 post 引數包含到您傳遞給 buildAuthorisationHeader func 的 OAuth 陣列中:)

我希望這對你有所幫助,因為它在我讓它作業之前讓我發瘋了好幾個小時。我現在對 OAuth 的了解比我想了解的還要多,哈哈。

PS - 成功后,您應該在 JSON 回應中收到一大塊擴展屬性,詳細說明推文中包含的影像/視頻。

uj5u.com熱心網友回復:

我創建了這段代碼,它作業得很好:如果有人需要幫助或想在沒有任何庫的情況下將影像和狀態上傳到 twitter ;)

<?php

function post_media_status($url, $method, $media_ids, $status, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{

    $nonce = time();
    $timenow = time();
    $signature = build_signature($url, $method, $media_ids, $status, $nonce, $timenow, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
    //print($signature);

    $oauth = array(
        'oauth_consumer_key' => $oauthconsumerkey,
        'oauth_nonce' => $nonce,
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_token' => $oauthtoken,
        'oauth_timestamp' => $timenow
    );
    $oauth['oauth_signature'] = $signature;

    $header = array(buildAuthorizationHeader($oauth));
    var_dump($header);

    curl_post_status_media($url, $header, $media_ids, $status);
}

function build_signature($url, $method, $media_ids, $status, $nonce, $timenow, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{

    $key = rawurlencode($clientsecret) . "&" . rawurlencode($tokensecret);

    $paramstring = "media_ids=" . $media_ids . "&oauth_consumer_key=" . $oauthconsumerkey . "&oauth_nonce=" . $nonce . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_token=" . $oauthtoken . "&status=" . $status;
    $encodeurl = $method . "&" . rawurlencode($url) . "&" . rawurlencode($paramstring);
    $signature = hash_hmac('sha1', $encodeurl, $key, TRUE);
    $signature = base64_encode($signature);
    return $signature;
}

function curl_post_status_media($url, $header, $media_ids, $status)
{
    $options = array(
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_POSTFIELDS => "status=" . $status . "&media_ids=" . $media_ids,
        CURLOPT_HEADER => false,
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false
    );

    $request = curl_init();
    curl_setopt_array($request, $options);
    $response = curl_exec($request);
    $decoded = json_decode($response);
    var_dump($decoded);
    curl_close($request);
    return $response;
}

function buildAuthorizationHeader($oauth)
{
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach ($oauth as $key => $value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";
    $r .= implode(', ', $values);
    return $r;
}


function upload_media($postfields, $url, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{
    $oauth = array(
        'oauth_consumer_key' => $oauthconsumerkey,
        'oauth_nonce' => time(),
        'oauth_signature_method' => 'HMAC-SHA1',
        'oauth_token' => $oauthtoken,
        'oauth_timestamp' => time(),
        'oauth_version' => '1.0'
    );
    $base_info = buildBaseString($url, 'POST', $oauth);
    $composite_key = rawurlencode($clientsecret) . '&' . rawurlencode($tokensecret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;
    $header = array(buildAuthorizationHeader($oauth));
    $options = array(
        CURLOPT_HTTPHEADER => $header,
        CURLOPT_POSTFIELDS => $postfields,
        CURLOPT_HEADER => false,
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false
    );
    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    //var_dump($json);
    curl_close($feed);
    return $json;
}

function buildBaseString($baseURI, $method, $params)
{
    $r = array();
    ksort($params);
    foreach ($params as $key => $value) {
        $r[] = "$key=" . rawurlencode($value);
    }
    return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}


function post_media_with_status($file_location, $status, $oauthconsumerkey, $clientsecret, $tokensecret, $oauthtoken)
{
    $file = file_get_contents($file_location);
    $postfields = array("media_data" => base64_encode($file));
    $result = upload_media($postfields, "https://upload.twitter.com/1.1/media/upload.json", $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
    $imageresult = json_decode($result);
    var_dump($imageresult);
    $imageid = $imageresult->media_id_string;
    $result = post_media_status("https://api.twitter.com/1.1/statuses/update.json", "POST", $imageid, $status, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
    return $result;
}

post_media_with_status("IMAGE_URL", "Test", TWITTER_API_KEY, TWITTER_API_SECRET_KEY, "TOKEN_SECRET", "TOKEN");

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331442.html

標籤:php 卷曲 推特

上一篇:將內容添加到JSON物件陣串列的按鈕

下一篇:有什么方法可以在沒有客戶密鑰的情況下利用API嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more